# load required libraries
library(tidyverse)
── Attaching packages ────────────────────────────────── tidyverse 1.2.1 ──
✔ ggplot2 3.1.1     ✔ purrr   0.2.5
✔ tibble  2.1.1     ✔ dplyr   0.7.6
✔ tidyr   0.8.1     ✔ stringr 1.3.1
✔ readr   1.1.1     ✔ forcats 0.3.0
package ‘ggplot2’ was built under R version 3.5.2package ‘tibble’ was built under R version 3.5.2── Conflicts ───────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
library(langcog) # source: https://github.com/langcog/langcog-package

Attaching package: ‘langcog’

The following object is masked from ‘package:base’:

    scale
library(psych)

Attaching package: ‘psych’

The following objects are masked from ‘package:ggplot2’:

    %+%, alpha
library(lme4)
Loading required package: Matrix

Attaching package: ‘Matrix’

The following object is masked from ‘package:tidyr’:

    expand
library(kableExtra)
# set theme for ggplots
theme_set(theme_bw())
chosen_rot <- "oblimin"
# run source code (extra home-made functions)
source("./scripts/max_factors_efa.R")
source("./scripts/plot_fun.R")
source("./scripts/reten_fun.R")
source("./scripts/data_prep.R")
NAs introduced by coercionattributes are not identical across measure variables;
they will be droppedJoining, by = "question_qualtrics"
Joining, by = "question"
Joining, by = c("ResponseId", "attn_free_coded")
Column `ResponseId` joining character vector and factor, coercing into character vectorColumn `attn_free_coded` joining character vector and factor, coercing into character vectorJoining, by = "ResponseId"
Joining, by = "ResponseId"
NAs introduced by coercionJoining, by = "capacity"
Column `capacity` joining character vector and factor, coercing into character vectorJoining, by = "capacity"
Column `capacity` joining character vector and factor, coercing into character vectorJoining, by = "capacity"
Column `capacity` joining character vector and factor, coercing into character vectorJoining, by = "capacity"
Column `capacity` joining character vector and factor, coercing into character vector

“Baby Mental Life: Study 3” was conducted on MTurk on 2019-04-24.

Our planned sample was 300 participants; based on Study 2, we initially recruited 352 participants. After filtering out participants who failed at least one of our attention checks, we ended up retaining 279 participants (retention rate: 79.3%), but at this point we have not supplemented with additional recruiting. At each stage, we recruited women and men through separate studies, in hopes of acquiring a roughly equal split between genders.

In the end, we ended up with a sample of 279 participants who passed our attention checks, 249 of whom came from unique GPS coordinates (89.2%).

For this first pass, these data include participants where there is another participant with an identical set of GPS coordinates as recorded by Qualtrics.

Each participant assessed children’s mental capacities at 13 target ages between the ages of 0 and 5 years. For each target, they rated 8 mental capacities on a scale from 0 (not at all capable) to 100 (completely capable). In contrast to Study 2, participants completed all 13 ratings of a particular mental capacity on a single “trial” (rather than completing all 8 ratings of a particular target age on a single trial). In addition, participants answered questions about the “developmental factors” that might contribute to development in this domain.

For more details about the study, see our preregistration here.

Study 1 EFA

# load in EFA results from study 1
efa_S1 <- readRDS("../study 1/s1_efa.rds")
heatmap_fun(efa_S1) + 
  labs(title = paste0("STUDY 1 Parallel Analysis (rotation: ", chosen_rot, ")"),
       subtitle = "'% var.' indicates the amount of shared variance explained (total = 100%)")
Joining, by = "capacity"
Joining, by = "factor"

Plots: Capacity ratings as a function of target age and domain

ggplot(d_cap_rating %>%
         arrange(ResponseId, domain, capacity, target_ord) %>%
         mutate(domain = recode_factor(
           domain,
           "BOD" = "Bodily sensations",
           "NEG" = "Negative emotions",
           "POS" = "Social abilities & positive emotions",
           "COG" = "Cognition & control",
           .default = NA_character_),
           capacity = gsub("_", " ", capacity)),
       aes(x = target_num, y = response, group = ResponseId,
           color = domain)) +
  facet_wrap(~ domain ~ capacity, ncol = 4) +
  geom_path(alpha = 0.1) +
  geom_smooth(aes(group = capacity), 
              method = "loess", 
              color = "black") +
  scale_x_continuous(breaks = as.numeric(levels(factor(d_cap_rating$target_num))),
                     labels = levels(d_cap_rating$target_ord)) +
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Perceptions of development, by domain",
       subtitle = "Black line = loess smoothing",
       x = "Target age (numeric)",
       y = "Response (0 = not at all capable, 100 = completely capable)")

ggplot(d_cap_rating %>%
         arrange(ResponseId, domain, capacity, target_ord) %>%
         mutate(domain = recode_factor(
           domain,
           "BOD" = "Bodily sensations",
           "NEG" = "Negative emotions",
           "POS" = "Social abilities & positive emotions",
           "COG" = "Cognition & control",
           .default = NA_character_),
           capacity = gsub("_", " ", capacity)),
       aes(x = sqrt(target_num), y = response, group = ResponseId,
           color = domain)) +
  facet_wrap(~ domain ~ capacity, ncol = 4) +
  geom_path(alpha = 0.1) +
  geom_smooth(aes(group = capacity), 
              method = "loess", 
              color = "black") +
  scale_x_continuous(breaks = sqrt(as.numeric(levels(factor(d_cap_rating$target_num)))),
                     labels = levels(d_cap_rating$target_ord)) +
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Perceptions of development, by domain",
       subtitle = "Black line = loess smoothing",
       x = "Target age (numeric, square-root transformed)",
       y = "Response (0 = not at all capable, 100 = completely capable)")

ggplot(d_cap_rating %>%
         arrange(ResponseId, domain, capacity, target_ord) %>%
         mutate(domain = recode_factor(
           domain,
           "BOD" = "Bodily sensations",
           "NEG" = "Negative emotions",
           "POS" = "Social abilities & positive emotions",
           "COG" = "Cognition & control",
           .default = NA_character_),
           capacity = gsub("_", " ", capacity)),
       aes(x = target_ord, y = response, group = ResponseId,
           color = domain)) +
  facet_wrap(~ domain ~ capacity, ncol = 4) +
  geom_path(alpha = 0.1) +
  geom_smooth(aes(group = capacity), 
              method = "loess", 
              color = "black") +
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Perceptions of development, by domain",
       subtitle = "Black line = loess smoothing",
       x = "Target age (ordinal)",
       y = "Response (0 = not at all capable, 100 = completely capable)")

Regression models, version 1: Capacity ratings as a function of target age and domain

contrasts_domain_eff_noCOG <- cbind(BOD = c(1, -1, 0, 0),
                                    NEG = c(0, -1, 1, 0),
                                    POS = c(0, -1, 0, 1))
contrasts_domain_eff_noPOS <- cbind(BOD = c(1, 0, 0, -1),
                                    NEG = c(0, 0, 1, -1),
                                    COG = c(0, 1, 0, -1))
contrasts_domain_eff_noNEG <- cbind(BOD = c(1, 0, -1, 0),
                                    POS = c(0, 0, -1, 1),
                                    COG = c(0, 1, -1, 0))
contrasts_domain_eff_noBOD <- cbind(POS = c(-1, 0, 0, 1),
                                    NEG = c(-1, 0, 1, 0),
                                    COG = c(-1, 1, 0, 0))

Target age in months

Effect-coded (comparing all domains to the grand mean, except “bodily sensations”)

Linear effects only

# r1_noBOD <- lmer(response ~ target_num * domain
#                  + (target_num + domain | ResponseId) 
#                  + (target_num | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12),
#                  contrasts = list(domain = contrasts_domain_eff_noBOD))
# saveRDS(r1_noBOD, "./models/r1_noBOD.RDS")
r1_noBOD <- readRDS("./models/r1_noBOD.RDS")
summary(r1_noBOD, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: 
response ~ target_num * domain + (target_num + domain | ResponseId) +  
    (target_num | capacity)
   Data: d_cap_rating %>% mutate(target_num = target_num/12)

REML criterion at convergence: 228041.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.2123 -0.4827  0.0427  0.5204  4.6348 

Random effects:
 Groups     Name        Variance Std.Dev. Corr                   
 ResponseId (Intercept) 195.361  13.977                          
            target_num    9.655   3.107   -0.69                  
            domainPOS    91.876   9.585    0.34 -0.29            
            domainNEG   196.219  14.008    0.57 -0.41 -0.24      
            domainCOG   175.285  13.240   -0.22  0.30 -0.24 -0.58
 capacity   (Intercept) 193.647  13.916                          
            target_num    6.995   2.645   -0.86                  
 Residual               345.942  18.600                          
Number of obs: 25896, groups:  ResponseId, 249; capacity, 8

Fixed effects:
                     Estimate Std. Error t value
(Intercept)           55.2190     5.0015  11.041
target_num             8.1121     0.9584   8.465
domainPOS             -3.8395     8.5475  -0.449
domainNEG              9.0385     8.5719   1.054
domainCOG            -44.3093     8.5670  -5.172
target_num:domainPOS   3.8509     1.6245   2.370
target_num:domainNEG  -2.3475     1.6245  -1.445
target_num:domainCOG   5.4235     1.6245   3.339

Non-linear effects

# r2_noBOD <- lmer(response ~ poly(target_num, 3) * domain
#                  + (target_num + domain | ResponseId)
#                  + (target_num | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12),
#                  contrasts = list(domain = contrasts_domain_eff_noBOD))
# saveRDS(r2_noBOD, "./models/r2_noBOD.RDS")
r2_noBOD <- readRDS("./models/r2_noBOD.RDS")
summary(r2_noBOD, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ poly(target_num, 3) * domain + (target_num + domain |  
    ResponseId) + (target_num | capacity)
   Data: d_cap_rating %>% mutate(target_num = target_num/12)

REML criterion at convergence: 223981

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.2929 -0.4858  0.0105  0.5052  5.3522 

Random effects:
 Groups     Name        Variance Std.Dev. Corr                   
 ResponseId (Intercept)  89.405   9.455                          
            target_num    9.853   3.139   -0.56                  
            domainCOG   374.649  19.356   -0.47 -0.02            
            domainNEG   435.336  20.865    0.23 -0.48  0.27      
            domainPOS   277.020  16.644    0.04 -0.43  0.50  0.51
 capacity   (Intercept) 193.770  13.920                          
            target_num    7.004   2.646   -0.86                  
 Residual               294.790  17.169                          
Number of obs: 25896, groups:  ResponseId, 249; capacity, 8

Fixed effects:
                               Estimate Std. Error t value
(Intercept)                      66.666      3.914  17.031
poly(target_num, 3)1           2058.398    243.332   8.459
poly(target_num, 3)2           -844.244     17.169 -49.171
poly(target_num, 3)3            407.030     17.169  23.707
domainPOS                         1.595      6.691   0.238
domainNEG                         5.726      6.723   0.852
domainCOG                       -36.656      6.716  -5.458
poly(target_num, 3)1:domainPOS  977.144    412.297   2.370
poly(target_num, 3)2:domainPOS -862.372     29.738 -28.999
poly(target_num, 3)3:domainPOS  507.310     29.738  17.059
poly(target_num, 3)1:domainNEG -595.664    412.297  -1.445
poly(target_num, 3)2:domainNEG  173.963     29.738   5.850
poly(target_num, 3)3:domainNEG  -92.256     29.738  -3.102
poly(target_num, 3)1:domainCOG 1376.179    412.297   3.338
poly(target_num, 3)2:domainCOG   53.207     29.738   1.789
poly(target_num, 3)3:domainCOG -157.616     29.738  -5.300

Correlation matrix not shown by default, as p = 16 > 12.
Use print(x, correlation=TRUE)  or
     vcov(x)     if you need it

Effect-coded (comparing all domains to the grand mean, except “negative emotions”)

Linear effects only

# r1_noNEG <- lmer(response ~ target_num * domain
#                  + (target_num + domain | ResponseId)
#                  + (target_num | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12),
#                  contrasts = list(domain = contrasts_domain_eff_noNEG))
# saveRDS(r1_noNEG, "./models/r1_noNEG.RDS")
r1_noNEG <- readRDS("./models/r1_noNEG.RDS")
summary(r1_noNEG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: 
response ~ target_num * domain + (target_num + domain | ResponseId) +  
    (target_num | capacity)
   Data: d_cap_rating %>% mutate(target_num = target_num/12)

REML criterion at convergence: 228041.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.2123 -0.4827  0.0427  0.5204  4.6348 

Random effects:
 Groups     Name        Variance Std.Dev. Corr                   
 ResponseId (Intercept) 195.361  13.977                          
            target_num    9.655   3.107   -0.69                  
            domainPOS    91.876   9.585    0.34 -0.29            
            domainNEG   196.220  14.008    0.57 -0.41 -0.24      
            domainCOG   175.286  13.240   -0.22  0.30 -0.24 -0.58
 capacity   (Intercept) 193.749  13.919                          
            target_num    6.997   2.645   -0.86                  
 Residual               345.942  18.600                          
Number of obs: 25896, groups:  ResponseId, 249; capacity, 8

Fixed effects:
                     Estimate Std. Error t value
(Intercept)           55.2190     5.0027  11.038
target_num             8.1121     0.9585   8.463
domainBOD             39.1102     8.5568   4.571
domainPOS             -3.8395     8.5497  -0.449
domainCOG            -44.3093     8.5692  -5.171
target_num:domainBOD  -6.9269     1.6248  -4.263
target_num:domainPOS   3.8509     1.6248   2.370
target_num:domainCOG   5.4235     1.6248   3.338

Non-linear effects

# r2_noNEG <- lmer(response ~ poly(target_num, 3) * domain
#                  + (target_num + domain | ResponseId)
#                  + (target_num | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12),
#                  contrasts = list(domain = contrasts_domain_eff_noNEG))
# saveRDS(r2_noNEG, "./models/r2_noNEG.RDS")
r2_noNEG <- readRDS("./models/r2_noNEG.RDS")
summary(r2_noNEG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ poly(target_num, 3) * domain + (target_num + domain |  
    ResponseId) + (target_num | capacity)
   Data: d_cap_rating %>% mutate(target_num = target_num/12)

REML criterion at convergence: 223981

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.2929 -0.4858  0.0105  0.5052  5.3522 

Random effects:
 Groups     Name        Variance Std.Dev. Corr                   
 ResponseId (Intercept)  89.406   9.455                          
            target_num    9.853   3.139   -0.56                  
            domainCOG   374.656  19.356   -0.47 -0.02            
            domainNEG   435.338  20.865    0.23 -0.48  0.27      
            domainPOS   277.024  16.644    0.04 -0.43  0.50  0.51
 capacity   (Intercept) 193.741  13.919                          
            target_num    7.003   2.646   -0.86                  
 Residual               294.790  17.169                          
Number of obs: 25896, groups:  ResponseId, 249; capacity, 8

Fixed effects:
                                Estimate Std. Error t value
(Intercept)                       66.666      3.914  17.032
poly(target_num, 3)1            2058.398    243.316   8.460
poly(target_num, 3)2            -844.244     17.169 -49.171
poly(target_num, 3)3             407.030     17.169  23.707
domainBOD                         29.336      6.700   4.378
domainPOS                          1.595      6.691   0.238
domainCOG                        -36.656      6.716  -5.458
poly(target_num, 3)1:domainBOD -1757.660    412.269  -4.263
poly(target_num, 3)2:domainBOD   635.202     29.738  21.360
poly(target_num, 3)3:domainBOD  -257.438     29.738  -8.657
poly(target_num, 3)1:domainPOS   977.144    412.269   2.370
poly(target_num, 3)2:domainPOS  -862.372     29.738 -28.999
poly(target_num, 3)3:domainPOS   507.310     29.738  17.059
poly(target_num, 3)1:domainCOG  1376.179    412.269   3.338
poly(target_num, 3)2:domainCOG    53.207     29.738   1.789
poly(target_num, 3)3:domainCOG  -157.616     29.738  -5.300

Correlation matrix not shown by default, as p = 16 > 12.
Use print(x, correlation=TRUE)  or
     vcov(x)     if you need it

Effect-coded (comparing all domains to the grand mean, except “social abilities & positive emotions”)

Linear effects only

# r1_noPOS <- lmer(response ~ target_num * domain
#                  + (target_num + domain | ResponseId)
#                  + (target_num | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12),
#                  contrasts = list(domain = contrasts_domain_eff_noPOS))
# saveRDS(r1_noPOS, "./models/r1_noPOS.RDS")
r1_noPOS <- readRDS("./models/r1_noPOS.RDS")
summary(r1_noPOS, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: 
response ~ target_num * domain + (target_num + domain | ResponseId) +  
    (target_num | capacity)
   Data: d_cap_rating %>% mutate(target_num = target_num/12)

REML criterion at convergence: 228041.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.2123 -0.4827  0.0427  0.5204  4.6348 

Random effects:
 Groups     Name        Variance Std.Dev. Corr                   
 ResponseId (Intercept) 195.359  13.977                          
            target_num    9.655   3.107   -0.69                  
            domainPOS    91.877   9.585    0.34 -0.29            
            domainNEG   196.219  14.008    0.57 -0.41 -0.24      
            domainCOG   175.285  13.240   -0.22  0.30 -0.24 -0.58
 capacity   (Intercept) 193.641  13.915                          
            target_num    6.994   2.645   -0.86                  
 Residual               345.942  18.600                          
Number of obs: 25896, groups:  ResponseId, 249; capacity, 8

Fixed effects:
                     Estimate Std. Error t value
(Intercept)           55.2190     5.0014  11.041
target_num             8.1121     0.9584   8.465
domainBOD             39.1102     8.5545   4.572
domainNEG              9.0385     8.5718   1.054
domainCOG            -44.3093     8.5669  -5.172
target_num:domainBOD  -6.9269     1.6245  -4.264
target_num:domainNEG  -2.3475     1.6245  -1.445
target_num:domainCOG   5.4235     1.6245   3.339

Non-linear effects

# r2_noPOS <- lmer(response ~ poly(target_num, 3) * domain
#                  + (target_num + domain | ResponseId)
#                  + (target_num | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12),
#                  contrasts = list(domain = contrasts_domain_eff_noPOS))
# saveRDS(r2_noPOS, "./models/r2_noPOS.RDS")
r2_noPOS <- readRDS("./models/r2_noPOS.RDS")
summary(r2_noPOS, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ poly(target_num, 3) * domain + (target_num + domain |  
    ResponseId) + (target_num | capacity)
   Data: d_cap_rating %>% mutate(target_num = target_num/12)

REML criterion at convergence: 223981

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.2929 -0.4858  0.0105  0.5052  5.3522 

Random effects:
 Groups     Name        Variance Std.Dev. Corr                   
 ResponseId (Intercept)  89.406   9.455                          
            target_num    9.853   3.139   -0.56                  
            domainCOG   374.652  19.356   -0.47 -0.02            
            domainNEG   435.336  20.865    0.23 -0.48  0.27      
            domainPOS   277.022  16.644    0.04 -0.43  0.50  0.51
 capacity   (Intercept) 193.677  13.917                          
            target_num    7.001   2.646   -0.86                  
 Residual               294.790  17.169                          
Number of obs: 25896, groups:  ResponseId, 249; capacity, 8

Fixed effects:
                                Estimate Std. Error t value
(Intercept)                       66.666      3.914  17.035
poly(target_num, 3)1            2058.398    243.287   8.461
poly(target_num, 3)2            -844.244     17.169 -49.171
poly(target_num, 3)3             407.030     17.169  23.707
domainBOD                         29.336      6.699   4.379
domainNEG                          5.726      6.721   0.852
domainCOG                        -36.656      6.715  -5.459
poly(target_num, 3)1:domainBOD -1757.660    412.216  -4.264
poly(target_num, 3)2:domainBOD   635.202     29.738  21.360
poly(target_num, 3)3:domainBOD  -257.438     29.738  -8.657
poly(target_num, 3)1:domainNEG  -595.664    412.216  -1.445
poly(target_num, 3)2:domainNEG   173.963     29.738   5.850
poly(target_num, 3)3:domainNEG   -92.256     29.738  -3.102
poly(target_num, 3)1:domainCOG  1376.179    412.216   3.338
poly(target_num, 3)2:domainCOG    53.207     29.738   1.789
poly(target_num, 3)3:domainCOG  -157.616     29.738  -5.300

Correlation matrix not shown by default, as p = 16 > 12.
Use print(x, correlation=TRUE)  or
     vcov(x)     if you need it

Effect-coded (comparing all domains to the grand mean, except “cognition & control”)

Linear effects only

# r1_noCOG <- lmer(response ~ target_num * domain
#                  + (target_num + domain | ResponseId)
#                  + (target_num | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12),
#                  contrasts = list(domain = contrasts_domain_eff_noCOG))
# saveRDS(r1_noCOG, "./models/r1_noCOG.RDS")
r1_noCOG <- readRDS("./models/r1_noCOG.RDS")
summary(r1_noCOG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: 
response ~ target_num * domain + (target_num + domain | ResponseId) +  
    (target_num | capacity)
   Data: d_cap_rating %>% mutate(target_num = target_num/12)

REML criterion at convergence: 228041.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.2123 -0.4827  0.0427  0.5204  4.6348 

Random effects:
 Groups     Name        Variance Std.Dev. Corr                   
 ResponseId (Intercept) 195.360  13.977                          
            target_num    9.655   3.107   -0.69                  
            domainPOS    91.877   9.585    0.34 -0.29            
            domainNEG   196.219  14.008    0.57 -0.41 -0.24      
            domainCOG   175.284  13.239   -0.22  0.30 -0.24 -0.58
 capacity   (Intercept) 193.602  13.914                          
            target_num    6.993   2.644   -0.86                  
 Residual               345.942  18.600                          
Number of obs: 25896, groups:  ResponseId, 249; capacity, 8

Fixed effects:
                     Estimate Std. Error t value
(Intercept)           55.2190     5.0009  11.042
target_num             8.1121     0.9583   8.465
domainBOD             39.1102     8.5536   4.572
domainNEG              9.0385     8.5709   1.055
domainPOS             -3.8395     8.5464  -0.449
target_num:domainBOD  -6.9269     1.6244  -4.264
target_num:domainNEG  -2.3475     1.6244  -1.445
target_num:domainPOS   3.8509     1.6244   2.371

Non-linear effects

# r2_noCOG <- lmer(response ~ poly(target_num, 3) * domain
#                  + (target_num + domain | ResponseId)
#                  + (target_num | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12),
#                  contrasts = list(domain = contrasts_domain_eff_noCOG))
# saveRDS(r2_noCOG, "./models/r2_noCOG.RDS")
r2_noCOG <- readRDS("./models/r2_noCOG.RDS")
summary(r2_noCOG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ poly(target_num, 3) * domain + (target_num + domain |  
    ResponseId) + (target_num | capacity)
   Data: d_cap_rating %>% mutate(target_num = target_num/12)

REML criterion at convergence: 223981

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.2929 -0.4858  0.0105  0.5052  5.3522 

Random effects:
 Groups     Name        Variance Std.Dev. Corr                   
 ResponseId (Intercept)  89.405   9.455                          
            target_num    9.853   3.139   -0.56                  
            domainCOG   374.650  19.356   -0.47 -0.02            
            domainNEG   435.333  20.865    0.23 -0.48  0.27      
            domainPOS   277.018  16.644    0.04 -0.43  0.50  0.51
 capacity   (Intercept) 193.787  13.921                          
            target_num    7.004   2.646   -0.86                  
 Residual               294.790  17.169                          
Number of obs: 25896, groups:  ResponseId, 249; capacity, 8

Fixed effects:
                                Estimate Std. Error t value
(Intercept)                       66.666      3.915  17.030
poly(target_num, 3)1            2058.398    243.334   8.459
poly(target_num, 3)2            -844.244     17.169 -49.171
poly(target_num, 3)3             407.030     17.169  23.707
domainBOD                         29.336      6.701   4.378
domainNEG                          5.726      6.723   0.852
domainPOS                          1.595      6.692   0.238
poly(target_num, 3)1:domainBOD -1757.660    412.300  -4.263
poly(target_num, 3)2:domainBOD   635.202     29.738  21.360
poly(target_num, 3)3:domainBOD  -257.438     29.738  -8.657
poly(target_num, 3)1:domainNEG  -595.664    412.300  -1.445
poly(target_num, 3)2:domainNEG   173.963     29.738   5.850
poly(target_num, 3)3:domainNEG   -92.256     29.738  -3.102
poly(target_num, 3)1:domainPOS   977.144    412.300   2.370
poly(target_num, 3)2:domainPOS  -862.372     29.738 -28.999
poly(target_num, 3)3:domainPOS   507.310     29.738  17.059

Correlation matrix not shown by default, as p = 16 > 12.
Use print(x, correlation=TRUE)  or
     vcov(x)     if you need it

Target age in months (square-root transformation)

NOTE: All of these models fail to meet our criterion of random effects being correlation < 0.90. Because of this, I have not included in this print-out and I have not yet modeled non-linear effects after square-root transformation. The next step will be to try simpler random effects models (with fewer random slopes).

Regression models, version 2: Capacity ratings as a function of target age, for each domain separately

NOTE: All of the preregistered models fail to meet our criterion of random effects being correlation < 0.90. Because of this, I instead used simpler random effects models (with fewer random slopes), as indicated in the preregistration.

Target age in months

Bodily sensations

Linear effects only

# r5a_BOD <- lmer(response ~ target_num
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "BOD"))
# saveRDS(r5a_BOD, "./models/r5a_BOD.RDS")
r5a_BOD <- readRDS("./models/r5a_BOD.RDS")
summary(r5a_BOD, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ target_num + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "BOD")

REML criterion at convergence: 55342

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-8.0547 -0.1326  0.1032  0.2568  3.8043 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 101.283  10.064  
 capacity   (Intercept)   1.223   1.106  
 Residual               106.243  10.307  
Number of obs: 7254, groups:  ResponseId, 279; capacity, 2

Fixed effects:
            Estimate Std. Error t value
(Intercept) 93.31343    1.00055   93.26
target_num   1.32602    0.07675   17.28

Non-linear effects

# r6a_BOD <- lmer(response ~ poly(target_num, 3)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "BOD"))
# saveRDS(r6a_BOD, "./models/r6a_BOD.RDS")
r6a_BOD <- readRDS("./models/r6a_BOD.RDS")
summary(r6a_BOD, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: 
response ~ poly(target_num, 3) + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "BOD")

REML criterion at convergence: 48865.4

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-8.1452 -0.2055  0.0208  0.3275  3.8911 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 69.69    8.348   
 capacity   (Intercept)  1.08    1.039   
 Residual               99.44    9.972   
Number of obs: 6474, groups:  ResponseId, 249; capacity, 2

Fixed effects:
                     Estimate Std. Error t value
(Intercept)            96.002      0.914 105.038
poly(target_num, 3)1  150.369      9.972  15.079
poly(target_num, 3)2 -104.521      9.972 -10.482
poly(target_num, 3)3   74.796      9.972   7.501

Negative emotions

Linear effects only

# r5a_NEG <- lmer(response ~ target_num
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "NEG"))
# saveRDS(r5a_NEG, "./models/r5a_NEG.RDS")
r5a_NEG <- readRDS("./models/r5a_NEG.RDS")
summary(r5a_NEG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ target_num + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "NEG")

REML criterion at convergence: 67536.4

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.8357 -0.5649  0.0850  0.7065  3.1869 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 485.5    22.03   
 capacity   (Intercept) 233.9    15.30   
 Residual               573.1    23.94   
Number of obs: 7254, groups:  ResponseId, 279; capacity, 2

Fixed effects:
            Estimate Std. Error t value
(Intercept)  63.4263    10.9020   5.818
target_num    5.9054     0.1783  33.128

Non-linear effects

# r6a_NEG <- lmer(response ~ poly(target_num, 3)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "NEG"))
# saveRDS(r6a_NEG, "./models/r6a_NEG.RDS")
r6a_NEG <- readRDS("./models/r6a_NEG.RDS")
summary(r6a_NEG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: 
response ~ poly(target_num, 3) + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "NEG")

REML criterion at convergence: 59981.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.6632 -0.6339  0.0748  0.6934  3.4866 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 491.7    22.18   
 capacity   (Intercept) 232.9    15.26   
 Residual               549.0    23.43   
Number of obs: 6474, groups:  ResponseId, 249; capacity, 2

Fixed effects:
                     Estimate Std. Error t value
(Intercept)             72.39      10.89   6.650
poly(target_num, 3)1   731.37      23.43  31.214
poly(target_num, 3)2  -335.14      23.43 -14.304
poly(target_num, 3)3   157.39      23.43   6.717

Social abilities & positive emotions

Linear effects only

# r5a_POS <- lmer(response ~ target_num
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "POS"))
# saveRDS(r5a_POS, "./models/r5a_POS.RDS")
r5a_POS <- readRDS("./models/r5a_POS.RDS")
summary(r5a_POS, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ target_num + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "POS")

REML criterion at convergence: 67370.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.5267 -0.7058  0.0847  0.7521  2.5604 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 270.5    16.45   
 capacity   (Intercept) 228.1    15.10   
 Residual               572.1    23.92   
Number of obs: 7254, groups:  ResponseId, 279; capacity, 2

Fixed effects:
            Estimate Std. Error t value
(Intercept)  50.6737    10.7317   4.722
target_num   11.9782     0.1781  67.256

Non-linear effects

# r6a_POS <- lmer(response ~ poly(target_num, 3)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "POS"))
# saveRDS(r6a_POS, "./models/r6a_POS.RDS")
r6a_POS <- readRDS("./models/r6a_POS.RDS")
summary(r6a_POS, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: 
response ~ poly(target_num, 3) + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "POS")

REML criterion at convergence: 58183.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.4247 -0.6793 -0.0423  0.6627  3.0011 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 284.4    16.86   
 capacity   (Intercept) 209.4    14.47   
 Residual               420.1    20.50   
Number of obs: 6474, groups:  ResponseId, 249; capacity, 2

Fixed effects:
                     Estimate Std. Error t value
(Intercept)             68.26      10.29   6.632
poly(target_num, 3)1  1517.77      20.50  74.055
poly(target_num, 3)2  -853.31      20.50 -41.635
poly(target_num, 3)3   457.17      20.50  22.306

Negative emotions

Linear effects only

# r5a_COG <- lmer(response ~ target_num
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "COG"))
# saveRDS(r5a_COG, "./models/r5a_COG.RDS")
r5a_COG <- readRDS("./models/r5a_COG.RDS")
summary(r5a_COG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ target_num + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "COG")

REML criterion at convergence: 62229.9

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.1523 -0.6120 -0.0335  0.5330  4.1114 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 248.02   15.749  
 capacity   (Intercept)  25.34    5.033  
 Residual               275.14   16.587  
Number of obs: 7254, groups:  ResponseId, 279; capacity, 2

Fixed effects:
            Estimate Std. Error t value
(Intercept)  10.7635     3.6912   2.916
target_num   13.4807     0.1235 109.145

Non-linear effects

# r6a_COG <- lmer(response ~ poly(target_num, 3)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "COG"))
# saveRDS(r6a_COG, "./models/r6a_COG.RDS")
r6a_COG <- readRDS("./models/r6a_COG.RDS")
summary(r6a_COG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: 
response ~ poly(target_num, 3) + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "COG")

REML criterion at convergence: 54889.4

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.9686 -0.6187 -0.0333  0.5887  4.1843 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 261.07   16.158  
 capacity   (Intercept)  29.69    5.449  
 Residual               248.48   15.763  
Number of obs: 6474, groups:  ResponseId, 249; capacity, 2

Fixed effects:
                     Estimate Std. Error t value
(Intercept)            30.010      3.991   7.519
poly(target_num, 3)1 1717.288     15.763 108.942
poly(target_num, 3)2 -395.519     15.763 -25.091
poly(target_num, 3)3  124.707     15.763   7.911

Target age in months (square-root transformation)

Bodily sensations

Linear effects only

# r7a_BOD <- lmer(response ~ sqrt(target_num)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "BOD"))
# saveRDS(r7a_BOD, "./models/r7a_BOD.RDS")
r7a_BOD <- readRDS("./models/r7a_BOD.RDS")
summary(r7a_BOD, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ sqrt(target_num) + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "BOD")

REML criterion at convergence: 55196.4

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-7.9734 -0.2182  0.0823  0.2948  4.0115 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 101.366  10.068  
 capacity   (Intercept)   1.224   1.106  
 Residual               104.071  10.202  
Number of obs: 7254, groups:  ResponseId, 279; capacity, 2

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       91.6317     1.0088   90.83
sqrt(target_num)   3.6774     0.1733   21.22

Non-linear effects

# r8a_BOD <- lmer(response ~ poly(sqrt(target_num), 3)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "BOD"))
# saveRDS(r8a_BOD, "./models/r8a_BOD.RDS")
r8a_BOD <- readRDS("./models/r8a_BOD.RDS")
summary(r8a_BOD, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ poly(sqrt(target_num), 3) + (1 | ResponseId) + (1 |  
    capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "BOD")

REML criterion at convergence: 48802.4

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-8.0087 -0.1792 -0.0219  0.3389  4.1311 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 69.73    8.351   
 capacity   (Intercept)  1.08    1.039   
 Residual               98.43    9.921   
Number of obs: 6474, groups:  ResponseId, 249; capacity, 2

Fixed effects:
                           Estimate Std. Error t value
(Intercept)                 96.0017     0.9141 105.028
poly(sqrt(target_num), 3)1 185.1919     9.9214  18.666
poly(sqrt(target_num), 3)2 -98.7964     9.9214  -9.958
poly(sqrt(target_num), 3)3  36.1618     9.9214   3.645

Negative emotions

Linear effects only

# r7a_NEG <- lmer(response ~ sqrt(target_num)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "NEG"))
# saveRDS(r7a_NEG, "./models/r7a_NEG.RDS")
r7a_NEG <- readRDS("./models/r7a_NEG.RDS")
summary(r7a_NEG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ sqrt(target_num) + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "NEG")

REML criterion at convergence: 67281.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.8115 -0.5996  0.0806  0.6890  3.5062 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 486.3    22.05   
 capacity   (Intercept) 233.9    15.30   
 Residual               552.6    23.51   
Number of obs: 7254, groups:  ResponseId, 279; capacity, 2

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       57.3409    10.9058   5.258
sqrt(target_num)  14.9239     0.3994  37.370

Non-linear effects

# r8a_NEG <- lmer(response ~ poly(sqrt(target_num), 3)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "NEG"))
# saveRDS(r8a_NEG, "./models/r8a_NEG.RDS")
r8a_NEG <- readRDS("./models/r8a_NEG.RDS")
summary(r8a_NEG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ poly(sqrt(target_num), 3) + (1 | ResponseId) + (1 |  
    capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "NEG")

REML criterion at convergence: 59962.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.6297 -0.6396  0.0635  0.6857  3.6271 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 491.8    22.18   
 capacity   (Intercept) 232.9    15.26   
 Residual               547.3    23.39   
Number of obs: 6474, groups:  ResponseId, 249; capacity, 2

Fixed effects:
                           Estimate Std. Error t value
(Intercept)                   72.39      10.89   6.650
poly(sqrt(target_num), 3)1   809.13      23.39  34.586
poly(sqrt(target_num), 3)2  -164.47      23.39  -7.030
poly(sqrt(target_num), 3)3   -25.42      23.39  -1.087

Social abilities & positive emotions

Linear effects only

# r7a_POS <- lmer(response ~ sqrt(target_num)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "POS"))
# saveRDS(r7a_POS, "./models/r7a_POS.RDS")
r7a_POS <- readRDS("./models/r7a_POS.RDS")
summary(r7a_POS, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ sqrt(target_num) + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "POS")

REML criterion at convergence: 65829.3

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.4837 -0.7186  0.0141  0.6928  2.6515 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 274.9    16.58   
 capacity   (Intercept) 228.1    15.10   
 Residual               458.7    21.42   
Number of obs: 7254, groups:  ResponseId, 279; capacity, 2

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       37.4105    10.7351   3.485
sqrt(target_num)  31.2231     0.3638  85.813

Non-linear effects

# r8a_POS <- lmer(response ~ poly(sqrt(target_num), 3)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "POS"))
# saveRDS(r8a_POS, "./models/r8a_POS.RDS")
r8a_POS <- readRDS("./models/r8a_POS.RDS")
summary(r8a_POS, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ poly(sqrt(target_num), 3) + (1 | ResponseId) + (1 |  
    capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "POS")

REML criterion at convergence: 58019

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.3200 -0.6911 -0.0292  0.6444  3.3365 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 284.8    16.88   
 capacity   (Intercept) 209.4    14.47   
 Residual               409.1    20.23   
Number of obs: 6474, groups:  ResponseId, 249; capacity, 2

Fixed effects:
                           Estimate Std. Error t value
(Intercept)                   68.26      10.29   6.632
poly(sqrt(target_num), 3)1  1736.76      20.23  85.868
poly(sqrt(target_num), 3)2  -540.07      20.23 -26.702
poly(sqrt(target_num), 3)3   -30.24      20.23  -1.495

Cognition & control

Linear effects only

# r7a_COG <- lmer(response ~ sqrt(target_num)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "COG"))
# saveRDS(r7a_COG, "./models/r7a_COG.RDS")
r7a_COG <- readRDS("./models/r7a_COG.RDS")
summary(r7a_COG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ sqrt(target_num) + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "COG")

REML criterion at convergence: 61697.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.8211 -0.6330 -0.0502  0.5957  3.9643 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 248.79   15.773  
 capacity   (Intercept)  25.34    5.034  
 Residual               254.98   15.968  
Number of obs: 7254, groups:  ResponseId, 279; capacity, 2

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       -0.5581     3.6968  -0.151
sqrt(target_num)  31.4079     0.2713 115.783

Non-linear effects

# r8a_COG <- lmer(response ~ poly(sqrt(target_num), 3)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "COG"))
# saveRDS(r8a_COG, "./models/r8a_COG.RDS")
r8a_COG <- readRDS("./models/r8a_COG.RDS")
summary(r8a_COG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ poly(sqrt(target_num), 3) + (1 | ResponseId) + (1 |  
    capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "COG")

REML criterion at convergence: 54905.8

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.8884 -0.6120 -0.0278  0.5740  4.1611 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 261.04   16.157  
 capacity   (Intercept)  29.69    5.449  
 Residual               249.14   15.784  
Number of obs: 6474, groups:  ResponseId, 249; capacity, 2

Fixed effects:
                           Estimate Std. Error t value
(Intercept)                  30.010      3.991   7.519
poly(sqrt(target_num), 3)1 1756.660     15.784 111.293
poly(sqrt(target_num), 3)2  108.002     15.784   6.842
poly(sqrt(target_num), 3)3 -139.527     15.784  -8.840

Plots: Ratings for developmental factors, by domain and capacity

ggplot(d_dev_factor_rating %>%
         mutate(domain = recode_factor(
           domain,
           "BOD" = "Bodily sensations",
           "NEG" = "Negative emotions",
           "POS" = "Social abilities & positive emotions",
           "COG" = "Cognition & control",
           .default = NA_character_)) %>%
         mutate_at(vars(capacity, dev_factor),
                   funs(gsub("_", " ", .))) %>%
         mutate(dev_factor = factor(
           dev_factor,
           levels = gsub("_", " ", levels(d_dev_factor_rating$dev_factor)))),
       aes(x = dev_factor, y = response, color = domain)) +
  facet_wrap(~ domain ~ capacity, ncol = 4) +
  geom_jitter(alpha = 0.025, height = 0.2, width = 0.2) +
  geom_pointrange(data = . %>% group_by(domain, capacity, dev_factor) %>%
                    multi_boot_standard(col = "response", na.rm = T),
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper),
                  color = "black", fatten = 4) +
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Ratings of developmental factors (Version 1)",
       subtitle = "Error bars are bootstrapped 95% CIs",
       x = "Developmental factor", 
       y = "Response (0 = plays no role, 6 = plays a very important role)")

ggplot(d_dev_factor_rating %>%
         mutate(domain = recode_factor(
           domain,
           "BOD" = "Bodily sensations",
           "NEG" = "Negative emotions",
           "POS" = "Social abilities & positive emotions",
           "COG" = "Cognition & control",
           .default = NA_character_)) %>%
         mutate_at(vars(capacity, dev_factor),
                   funs(gsub("_", " ", .))) %>%
         mutate(dev_factor = factor(
           dev_factor,
           levels = gsub("_", " ", levels(d_dev_factor_rating$dev_factor)))),
       aes(x = reorder(capacity, as.numeric(domain)), 
           y = response, color = domain)) +
  facet_wrap(~ dev_factor, ncol = 5) +
  geom_jitter(alpha = 0.025, height = 0.2, width = 0.2) +
  geom_pointrange(data = . %>% group_by(domain, capacity, dev_factor) %>%
                    multi_boot_standard(col = "response", na.rm = T),
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper),
                  color = "black", fatten = 4) +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  guides(color = guide_legend(override.aes = list(alpha = 1, size = 3))) +
  labs(title = "Ratings of developmental factors (Version 2)",
       subtitle = "Error bars are bootstrapped 95% CIs",
       color = "Domain",
       x = "Capacity (by domain)", 
       y = "Response (0 = plays no role, 6 = plays a very important role)")

ggplot(d_dev_factor_rating %>%
         mutate(dev_factor = factor(
           gsub("_", " ", dev_factor),
           levels = gsub("_", " ", levels(d_dev_factor_rating$dev_factor)))),
       aes(x = dev_factor, y = response)) +
  geom_jitter(alpha = 0.01, height = 0.3, width = 0.3, color = "blue") +
  geom_pointrange(data = . %>% group_by(dev_factor) %>%
                    multi_boot_standard(col = "response", na.rm = T),
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper),
                  color = "black", fatten = 2) +
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Ratings of developmental factors (Version 3)",
       subtitle = "Error bars are bootstrapped 95% CIs",
       x = "Developmental factor", 
       y = "Response (0 = plays no role, 6 = plays a very important role)")

Exploration: EFA/clustering of developmental factors

It could be nice to reduce the number of “devleopmental factors” from 10 down to something more manageable for analysis. Here I explore EFA and hierarchical clustering as dimension reduction methods, and re-plot with these results in mind.

temp <- d_dev_factor_rating %>%
  unite(key, ResponseId, domain, capacity) %>%
  spread(dev_factor, response) %>%
  column_to_rownames("key")
reten_fun(temp, "varimax")
[1] 2
# fa.parallel(temp)
# VSS(temp)
temp_efa <- fa(temp,
               # nfactors = 4,
               nfactors = reten_fun(temp, "varimax"),
               rotate = "varimax")
heatmap_fun(temp_efa) + 
  guides(fill = guide_colorbar(barheight = 8, barwidth = 0.5))
Joining, by = "capacity"
Joining, by = "factor"

library(ggdendro)
library(dendextend)

---------------------
Welcome to dendextend version 1.8.0
Type citation('dendextend') for how to cite the package.

Type browseVignettes(package = 'dendextend') for the package vignette.
The github page is: https://github.com/talgalili/dendextend/

Suggestions and bug-reports can be submitted at: https://github.com/talgalili/dendextend/issues
Or contact: <tal.galili@gmail.com>

    To suppress this message use:  suppressPackageStartupMessages(library(dendextend))
---------------------


Attaching package: ‘dendextend’

The following object is masked from ‘package:ggdendro’:

    theme_dendro

The following object is masked from ‘package:stats’:

    cutree
temp_hclust <- temp %>%
  t() %>%
  dist() %>%
  hclust()
temp_hclust_order <- data.frame(order = as.numeric(temp_hclust$order), 
                                dev_factor = as.character(temp_hclust$labels))
temp_hclust %>%
  ggdendrogram(rotate = F) +
  theme_minimal() +
  theme(#axis.title = element_blank(),
        # axis.text.y = element_blank(), 
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1),
        panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank()) +
  labs(title = "Hierarchical agglomerative clustering", 
       subtitle = "Complete linkage (default for stats::hclust() function)",
       x = "Developmental factor", y = "Height")

  # as.dendrogram() %>%
  # set("labels_col", k = 2) %>%
  # plot(horiz = T, xlim = c(-100, 200))
temp2 <- d_dev_factor_rating %>%
  mutate(dev_factor_cluster = case_when(
    dev_factor %in% c("experiments", "people_teach", "brain_changes", 
                      "observes_objects", "observes_people", 
                      "interacts_people") ~ "external",
    dev_factor %in% c("preprogrammed", "womb_experiences", "body_grows", 
                      "senses_improve") ~ "internal",
    TRUE ~ NA_character_)) %>%
  mutate(dev_factor_cluster = factor(dev_factor_cluster),
         response_cent = response - 3) %>%
  left_join(temp_hclust_order)
Joining, by = "dev_factor"
Column `dev_factor` joining factors with different levels, coercing to character vector
contrasts_cluster_eff <- cbind(EXT = c(1, -1))
ggplot(temp2 %>%
         mutate(domain = recode_factor(
           domain,
           "BOD" = "Bodily sensations",
           "NEG" = "Negative emotions",
           "POS" = "Social abilities & positive emotions",
           "COG" = "Cognition & control",
           .default = NA_character_)) %>%
         mutate_at(vars(capacity, dev_factor),
                   funs(gsub("_", " ", .))),
       aes(x = reorder(dev_factor, as.numeric(dev_factor_cluster)), 
           y = response, color = domain, shape = dev_factor_cluster)) +
  facet_wrap(~ domain ~ capacity, ncol = 4) +
  geom_jitter(alpha = 0.025, height = 0.2, width = 0.2, show.legend = F) +
  geom_pointrange(data = . %>% group_by(domain, capacity, 
                                        dev_factor_cluster, dev_factor) %>%
                    multi_boot_standard(col = "response", na.rm = T),
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper),
                  color = "black", fatten = 4) +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Ratings of developmental factors (Version 1)",
       subtitle = "Error bars are bootstrapped 95% CIs",
       shape = "Type of developmental factor (per EFA/clustering)",
       x = "Developmental factor", 
       y = "Response (0 = plays no role, 6 = plays a very important role)")

ggplot(temp2 %>%
         mutate(domain = recode_factor(
           domain,
           "BOD" = "Bodily sensations",
           "NEG" = "Negative emotions",
           "POS" = "Social abilities & positive emotions",
           "COG" = "Cognition & control",
           .default = NA_character_)) %>%
         mutate_at(vars(capacity),
                   funs(gsub("_", " ", .))),
       aes(x = reorder(capacity, as.numeric(domain)), 
           y = response, color = domain)) +
  facet_wrap(dev_factor_cluster ~ dev_factor, ncol = 6) +
  geom_jitter(alpha = 0.025, height = 0.2, width = 0.2) +
  geom_pointrange(data = . %>% group_by(domain, capacity, 
                                        dev_factor_cluster, dev_factor) %>%
                    multi_boot_standard(col = "response", na.rm = T),
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper),
                  color = "black", fatten = 4) +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  guides(color = guide_legend(override.aes = list(alpha = 1, size = 3))) +
  labs(title = "Ratings of developmental factors (Version 3)",
       subtitle = "Error bars are bootstrapped 95% CIs",
       color = "Domain",
       x = "Capacity (by domain)", 
       y = "Response (0 = plays no role, 6 = plays a very important role)")

r_temp <- lmer(response ~ domain * dev_factor_cluster + 
                 # (domain + dev_factor_cluster | ResponseId) +
                 # including both random intercepts yields corr > 0.9
                 (1 + dev_factor_cluster | ResponseId) +
                 (1 | capacity) + (1 | dev_factor),
               temp2,
               contrasts = list(domain = contrasts_domain_eff_noBOD,
                                dev_factor_cluster = contrasts_cluster_eff))
summary(r_temp)
Linear mixed model fit by REML ['lmerMod']
Formula: 
response ~ domain * dev_factor_cluster + (1 + dev_factor_cluster |  
    ResponseId) + (1 | capacity) + (1 | dev_factor)
   Data: temp2

REML criterion at convergence: 87685.9

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.4691 -0.7172  0.0083  0.7176  3.4754 

Random effects:
 Groups     Name                       Variance Std.Dev. Corr 
 ResponseId (Intercept)                0.72087  0.8490        
            dev_factor_clusterinternal 0.31234  0.5589   -0.16
 dev_factor (Intercept)                0.46942  0.6851        
 capacity   (Intercept)                0.08958  0.2993        
 Residual                              2.81132  1.6767        
Number of obs: 22320, groups:  
ResponseId, 279; dev_factor, 10; capacity, 8

Fixed effects:
                                Estimate Std. Error t value
(Intercept)                      3.13801    0.25063  12.520
domainPOS                        0.56263    0.18435   3.052
domainNEG                       -0.22642    0.18435  -1.228
domainCOG                        0.22527    0.18435   1.222
dev_factor_clusterEXT            0.35587    0.22206   1.603
domainPOS:dev_factor_clusterEXT  0.34522    0.01984  17.401
domainNEG:dev_factor_clusterEXT -0.10109    0.01984  -5.095
domainCOG:dev_factor_clusterEXT  0.83940    0.01984  42.309

Correlation of Fixed Effects:
            (Intr) dmnPOS dmnNEG dmnCOG d__EXT dPOS:_ dNEG:_
domainPOS    0.000                                          
domainNEG    0.000 -0.333                                   
domainCOG    0.000 -0.333 -0.333                            
dv_fctr_EXT -0.179  0.000  0.000  0.000                     
dmPOS:__EXT  0.000 -0.022  0.007  0.007  0.000              
dmNEG:__EXT  0.000  0.007 -0.022  0.007  0.000 -0.333       
dmCOG:__EXT  0.000  0.007  0.007 -0.022  0.000 -0.333 -0.333

(Note that domain was effect-coded and leaves out the bodily sensations domain here, but we could re-code it in all the different ways to get the contrast between bodily sensations and the grand mean as desired.)

I see three take-aways from these regression results, all of which I think I can see reflected in the plots above:

  1. Participants perceived the domain of social connection and positive emotions to be particularly dramatically shaped by the set of developmental factors we included in this study (relative to the grand mean collapsing across domains).
  2. On the whole, participants endorsed “external” and “internal” developmental factors equally strongly. If we were mapping this onto some sort of nature-nuruture distinction (not perfect, but tempting), I think we’d say that there’s no evidence for participants favoring either nature or nurture over the other as an explanation for growth in the capacities we included in this study.
  3. However, their endorsement of “external” and “internal” developmental factors varied by domain. They perceived “external” factors to play a larger role in the domains of social connection and positive emotions and especially cognition and control, and a relatively small role in the domain of negative emotions. (Looking at the plots, it seems like external factors were perceived as much more important than internal factors for cognition and control, a bit more important than internal factors for social connection and positive emotions, roughly equally important to internal factors for negative emotions, and less important than internal factors for bodily sensations. These interaction terms just confirm that the difference between “external” and “internal” varied significantly across domains.)

Table: Answers to (optional) free-response question about other developmental factors

d_dev_factor_other %>%
  mutate(domain = recode_factor(
    domain,
    "BOD" = "Bodily sensations",
    "NEG" = "Negative emotions",
    "POS" = "Social abilities & positive emotions",
    "COG" = "Cognition & control",
    .default = NA_character_),
    capacity = gsub("_", " ", capacity)) %>%
  filter(response != "idk") %>%
  distinct(domain, capacity, response) %>%
  arrange(domain, capacity, response) %>%
  kable(caption = "Free responses to optional question about other developmental factors that might play a role (excluding answers like 'N/A,' 'no,' 'not that I can think of', etc.)") %>%
  kable_styling() %>%
  collapse_rows(1:2)
Free responses to optional question about other developmental factors that might play a role (excluding answers like 'N/A,' 'no,' 'not that I can think of', etc.)
domain capacity response
Bodily sensations feeling pain Again, you're born with this ability
I think feeling pain is innate
I think pain is one of the first sensations that humans are able to actually comprehend
It is just a natural sensation. Our body is programmed to feel bad to avoid further injury or notifiy us that one has occured
Nervous system
None come to mind
Not that I can think of. I think everyone is capable of feeling pain, even at birth, as it is something physical. Whether they understand why they feel it though is a different story
Pain is likely the very first thing we all experience when we are born. Childbirth is not exactly pleasant for the mother or the baby
This is another one I would use the word "primal" to describe
Watching other's reaction to painful situations
Whether or not they could ignore it or recall feeling pain before and cope
getting hungry All children are capable of being hungry
Biological Need
child is controlling himself
everyone gets hungry no matter what the age is . it depends on how we show we are hungry
evolution, survival mechanisms
Getting hungry is one of the first things a newborn will experience
I think we're all just born with the feeling of hunger because he have to have nourishment
It's just survival at this point
just something theyre born with
None come to mind
the child being active and using enagy
The child has emotions that cause them to increase their desire to do this
the child just gets hungry- human nature
the more experience they have with food, the bigger the capacity for hunger
We are just preprogrammed to know when we are hungry.
Yeah, I think this one could be covered with just one answer and needs no further thought or explanation
You're born with this ability. Technically, you have this ability BEFORE you're born
Negative emotions feeling distressed again this is similar to the first one as they age they become more independent and spend less time distressed
Babies show that they can be distressed from birth, or even during labor.
Distress is a biological survival mechanism
Distress is easily felt regardless of age. The factors change. A newborn gets distressed if they are hungry, or tired, or sick, etc. A 5 year old can get distressed if their favorite toy breaks
Feeling distressed is natural as the child has physical needs and cannot attend to them on their own
General living
I believe the feeling of distress is another innate ability that we are able to feel from the moment we're born. I think living, breathing creature that has feelings is the same way from birht
I do not imagine that any child of any age does not have this ability
I feel like feeling distressed can be attributed to human's evolution. Distress would be hard coded in the DNA (panic when something bad happens help survival)
I think babies crying shows distress
I think it's similar to the pain feeling. They can feel distressed, but they may not understand the feeling
I think that feeling distressed is somewhat primal. Flight or flight, so to speak. I don't know if I would use the word "biological" to describe it, given my choice, but it's the closest out of the option provided. Then there are layers of socialization, etc. beyond that which amplify it
i think they always know distress in my opinion
if the child is left alone or isnt care for
It's an automatic response
It's the result of biological function, like pain response
Maybe hereditary?
Maybe the amount of nutrition a child gets throughout their life cycle
None come to mind
There could be physiological elements that prevent a child from being able to feel distress as acutely as other children
They are alive
They can feel stress from the people around them especially parents even inside the womb
You're born with all emotions, even if you don't understand them yet
feeling helpless Again, you're born with emotions. You might not fully comprehend them, but you have the ability to feel them, nontheless
as they age there is a tendency to become more independent and at that age less aware of danger
Feeling helpless is something that is learned through experience, not an innate ability
Feeling helplessness is not really an ability at all, it's an emotion. Most people are capable of feeling helpless
I don't think you can feel helpless until you become completely self aware, and I'm not sure when that happens
I feel like a kid would need to have some understanding of their emotions
I feel that it changes. A younger child may not know or understand the feeling of helpless. An older child my feel they are invinsible or independent.
I think helplessness stems from a fundamental fear of losing something we've got or not getting something we want (regardless of how well we are able to articulate or understand what that is in a sophisticated way)
I think it is just mental development. Young children don't really feel self pity
I think that it all surrounds object perception/realization. Once the child realizes that "food" makes them not hungry or "moving" makes them not hurt
I think this is something that happens later in life
My zero is because at the beginning, there's no feeling of self, so you can't feel helpless if you don't feel the self (in my opinion)
None come to mind
Not being taken care of or given what it wants would eventually make them real familiar with feeling helpless
The child has negative experiences that increase this
The child notices when it is not cared for properly by feelings of hunger,pain etc
The child's need to be loved and cared for contributes to their feeling helpless, since they are generally moreso helpless in the earlier stages of life than later
The child's needs change
This is also hard to rate but I go with my same rationale for happiness. Infants ARE helpless and I think on some leel they know it
Social abilities & positive emotions feeling happy A child that feels love feels happiness
Again, I think happiness (albeit, not amusement) is something relatively innate related to security & safety. I feel like this should be an incredibly easy question to pinpoint to a specific cause, and yet somehow it is not at all
As the brain grows, we are capable of sensating new emotions.
I think it's innate in children..Sometimes they interpret it differently as they get older though
I think its just within them to feel happy
it is a normal emotion
None come to mind
Other external stimuli encourages this
social environment
The child becomes more able to notice their own feelings
the child senses the love shared around him\her
The child's interests/needs change
This is a harder one for me to rate. I would say some form of emotional range is present at birth. It would have to be. Beyond that I do not know
Well fed or not
yes it depends if the child is in a good home or a bad home
You're born with this ability
learning from other people after the age of 2 or 3 the ability to learn langauges begins to diminish hence my ratings after that age
I feel like this is just the nature of human beings to learn from the others around (we wouldn't be where we are without it)
I think there are a ton of factors that lend to learning. I think it was one of the major purposes of the brain and so many, many parts of the brain and body contribute to it
kids love to copy people they are around and that how they learn
Learning is an innate ability. Generally, everyone is born with the ability to learn
None come to mind
Relationship with parents
The amount of nutrition the child gets throughout their life cycle
The more they age, the more connections the brain makes.
Cognition & control controlling their emotions A 0 to 9 month old infant is never wrong. You don't tell a 0 to 9 month old infant "No" or "Not right now". After 9 months, then you can start having that conversation
Children imitate other children
having very good role models and a good home to learn these in
I don't think anyone can control thier emotions (make yourself sad, NOW!), only the expression of them
I know a lot of adults that can't control their emotions. This is something you either have or don't have,
I would say the type of parenting being done by the parents
I'm afraid I don't have much to add here. Most of your questions covered it. I would say their environment, but that was, more or less, covered in the questions
Learning from adults reaction to behavior
Learning that outcomes can change depending on the the emotion they display
None come to mind
overall social environment
The child has life experiences after birth that increase their ability to do this
They aren't necessarily learning to control the emotion so much as the expression
They brains haven't fully developed they cab;'t help themselves and are still exploring their emotions
They react to positive or negative responses from other humans, if they control, or don't control their emotions
watching tv or movies
reasoning about things Again, up to about 9 months old the wiring is just not there. It beginbs to develop but... to be honest reasoning is something many adults fail at
Genetic driven intelligence ability
injury/disability
It's mostly just natural mental development
Maybe the amount of food/nutrition they get throughout their life cycle
None come to mind
not sure if they can have those skills
Nuerological development can impact this..for example if they develop brain injuries...autism etc
The more they age, the more they comprehend and understand.
watching tv or videos

Plots: Most important developmental factor, by domain and capacity

ggplot(d_dev_factor_most_important_choice %>%
         mutate(domain = recode_factor(
           domain,
           "BOD" = "Bodily sensations",
           "NEG" = "Negative emotions",
           "POS" = "Social abilities & positive emotions",
           "COG" = "Cognition & control",
           .default = NA_character_)) %>%
         mutate(dev_factor = case_when(
           grepl("Other", response) ~ "other",
           grepl("teach", response) ~ "people teach",
           grepl("experiments", response) ~ "experiments",
           grepl("womb", response) ~ "womb experiences",
           grepl("interacts", response) ~ "interacts people",
           grepl("preprogrammed", response) ~ "preprogrammed",
           grepl("objects", response) ~ "observes objects",
           grepl("observes the people", response) ~ "observes people",
           grepl("body grows", response) ~ "body grows",
           grepl("brain changes", response) ~ "brain changes",
           grepl("senses improve", response) ~ "senses improve"),
           dev_factor = factor(
             dev_factor,
             levels = c(gsub("_", " ", 
                             levels(d_dev_factor_rating$dev_factor)),
                        "other"))) %>%
         mutate_at(vars(capacity, response),
                   funs(gsub("_", " ", .))),
       aes(x = dev_factor, fill = domain)) +
  facet_wrap(~ domain ~ capacity, ncol = 4) +
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  geom_bar() +
  labs(title = "Choice of most important developmental factor (Version 1)",
       x = "Developmental factor", 
       y = "Number of participants")

temp_other <- d_dev_factor_most_important_choice %>% 
  filter(grepl("Other", response)) %>% 
  count(domain, capacity)
ggplot(d_dev_factor_most_important_choice %>%
         mutate(domain = recode_factor(
           domain,
           "BOD" = "Bodily sensations",
           "NEG" = "Negative emotions",
           "POS" = "Social abilities & positive emotions",
           "COG" = "Cognition & control",
           .default = NA_character_)) %>%
         mutate(dev_factor = case_when(
           grepl("Other", response) ~ "other",
           grepl("teach", response) ~ "people teach",
           grepl("experiments", response) ~ "experiments",
           grepl("womb", response) ~ "womb experiences",
           grepl("interacts", response) ~ "interacts people",
           grepl("preprogrammed", response) ~ "preprogrammed",
           grepl("objects", response) ~ "observes objects",
           grepl("observes the people", response) ~ "observes people",
           grepl("body grows", response) ~ "body grows",
           grepl("brain changes", response) ~ "brain changes",
           grepl("senses improve", response) ~ "senses improve"),
           dev_factor = factor(
             dev_factor,
             levels = c(gsub("_", " ", 
                             levels(d_dev_factor_rating$dev_factor)),
                        "other"))) %>%
         mutate_at(vars(capacity, response),
                   funs(gsub("_", " ", .))) %>%
         filter(dev_factor != "other"),
       aes(x = reorder(capacity, as.numeric(domain)), fill = domain)) +
  facet_wrap(~ dev_factor, ncol = 5) +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  geom_bar() +
  labs(title = "Choice of most important developmental factor (Version 2)",
       subtitle = paste0("Excluding answers of 'other' (n < ", 
                         max(temp_other$n) + 1, ") for any capacity"),
       color = "Domain",
       x = "Capacity (by domain)", 
       y = "Number of participants")

d_dev_factor_most_important_free %>%
  mutate(domain = recode_factor(
    domain,
    "BOD" = "Bodily sensations",
    "NEG" = "Negative emotions",
    "POS" = "Social abilities & positive emotions",
    "COG" = "Cognition & control",
    .default = NA_character_),
    capacity = gsub("_", " ", capacity)) %>%
  distinct(domain, capacity, response) %>%
  arrange(domain, capacity, response) %>%
  kable(caption = "Free responses when 'other' was selected as most important developmental factor") %>%
  kable_styling() %>%
  collapse_rows(1:2)
Free responses when 'other' was selected as most important developmental factor
domain capacity response
Bodily sensations feeling pain everyone is capable of feeling pain.
getting hungry All children are capable of being hungry.
Negative emotions feeling distressed As soon as his consious develops they are considered alive and capable of feeling.
emotional development
most id not all children are capable of experinceing distress not matter what.
feeling helpless Experiences in life
I really don't know.
Not sure helplessness is felt so young
Social abilities & positive emotions feeling happy Every child is capable of feeling happiness no matter what.
it is just a normal response too something enjoyed
learning from other people not sure
Cognition & control controlling their emotions impossibe

Demographics

ggplot(d_demo, aes(x = Duration/60)) + 
  geom_histogram(binwidth = 2) +
  geom_vline(xintercept = median(d_demo$Duration/60), color = "blue", lty = 2) +
  scale_x_continuous(breaks = seq(0, 10000, 4)) +
  labs(title = "Duration of study (according to Qualtrics)",
       subtitle = "Blue dotted line marks median",
       x = "Duration (in minutes)",
       y = "Number of participants")

ggplot(d_demo, aes(x = Age)) + 
  geom_histogram(binwidth = 2) +
  geom_vline(xintercept = median(d_demo$Age), color = "blue", lty = 2) +
  scale_x_continuous(breaks = seq(0, 10000, 4)) +
  labs(title = "Particpiant age (self-reported)",
       subtitle = "Blue dotted line marks median",
       x = "Age (in years)",
       y = "Number of participants")

ggplot(d_demo, aes(x = GenderSex)) + 
  geom_bar() +
  labs(title = "Particpiant gender/sex (self-reported)",
       x = "Gender/sex",
       y = "Number of participants")

ggplot(d_demo, aes(x = gsub('(.{1,30})(\\s|$)', '\\1\n', RaceEthnicity_collapse))) + 
  geom_bar() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Particpiant race/ethnicity (self-reported)",
       x = "Race/ethnicity",
       y = "Number of participants")

ggplot(d_demo, aes(x = FirstLang)) + 
  geom_bar() +
  labs(title = "Particpiant first language (self-reported)",
       x = "Language",
       y = "Number of participants")

ggplot(d_demo, aes(x = factor(Education,
                              levels = levels(d$Education),
                              labels = gsub('(.{1,30})(\\s|$)', '\\1\n', 
                                            levels(d$Education))))) + 
  geom_bar() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Particpiant educational attainment (self-reported)",
       x = "Highest level of education completed",
       y = "Number of participants")

ggplot(d_demo, aes(x = Income)) + 
  geom_bar() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Particpiant household income (self-reported)",
       x = "Annual household income",
       y = "Number of participants")

ggplot(d_demo, aes(x = HouseholdSize)) + 
  geom_histogram(binwidth = 1) +
  geom_vline(xintercept = median(d_demo$HouseholdSize), color = "blue", lty = 2) +
  scale_x_continuous(breaks = seq(0, 10000, 1)) +
  labs(title = "Particpiant household size (self-reported)",
       subtitle = "Blue dotted line marks median",
       x = "Number of people in household (adults and children)",
       y = "Number of participants")

ggplot(d_demo, aes(x = MaritalStatus)) + 
  geom_bar() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Particpiant marital status (self-reported)",
       x = "Marital status",
       y = "Number of participants")

ggplot(d_demo, aes(x = Parent)) + 
  geom_bar() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Particpiant parent status (self-reported)",
       subtitle = "'NA' indicates response of 'Prefer not to say'",
       x = "Parent status",
       y = "Number of participants")

ggplot(d_demo %>% filter(Parent == "Yes"), aes(x = ChildrenNumber)) + 
  geom_histogram(binwidth = 1) +
  geom_vline(xintercept = median(d_demo[d_demo$Parent == "Yes",]$ChildrenNumber, na.rm = T), 
             color = "blue", lty = 2) +
  scale_x_continuous(breaks = seq(0, 10000, 1)) +
  labs(title = "Number of children among parents (self-reported)",
       subtitle = "Blue dotted line marks median",
       x = "Number of children (among parents)",
       y = "Number of participants")

ggplot(d_demo %>% filter(Parent == "Yes"), 
       aes(x = factor(ChildrenYoungestAge_collapse,
                      levels = levels(d_demo$ChildrenYoungestAge_collapse),
                      labels = gsub('(.{1,30})(\\s|$)', '\\1\n', 
                                    levels(d_demo$ChildrenYoungestAge_collapse))))) + 
  geom_bar() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Age of youngest child among parents (self-reported)",
       x = "Age of child",
       y = "Number of participants")

ggplot(d_demo %>% filter(Parent == "Yes"), 
       aes(x = factor(ChildrenOldestAge_collapse,
                      levels = levels(d_demo$ChildrenOldestAge_collapse),
                      labels = gsub('(.{1,30})(\\s|$)', '\\1\n', 
                                    levels(d_demo$ChildrenOldestAge_collapse))))) + 
  geom_bar() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Age of oldest child among parents (self-reported)",
       x = "Age of child",
       y = "Number of participants")

LS0tCnRpdGxlOiAiQmFieSBNZW50YWwgTGlmZTogU3R1ZHkgMyIKc3VidGl0bGU6ICJQcmVyZWdpc3RlcmVkIGFuYWx5c2VzIgpkYXRlOiAyMDE4LTA1LTA3Cm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKYGBge3J9CiMgbG9hZCByZXF1aXJlZCBsaWJyYXJpZXMKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobGFuZ2NvZykgIyBzb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9sYW5nY29nL2xhbmdjb2ctcGFja2FnZQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMgc2V0IHRoZW1lIGZvciBnZ3Bsb3RzCnRoZW1lX3NldCh0aGVtZV9idygpKQoKY2hvc2VuX3JvdCA8LSAib2JsaW1pbiIKYGBgCgpgYGB7cn0KIyBydW4gc291cmNlIGNvZGUgKGV4dHJhIGhvbWUtbWFkZSBmdW5jdGlvbnMpCnNvdXJjZSgiLi9zY3JpcHRzL21heF9mYWN0b3JzX2VmYS5SIikKc291cmNlKCIuL3NjcmlwdHMvcGxvdF9mdW4uUiIpCnNvdXJjZSgiLi9zY3JpcHRzL3JldGVuX2Z1bi5SIikKc291cmNlKCIuL3NjcmlwdHMvZGF0YV9wcmVwLlIiKQpgYGAKCiJCYWJ5IE1lbnRhbCBMaWZlOiBTdHVkeSAzIiB3YXMgY29uZHVjdGVkIG9uIE1UdXJrIG9uIDIwMTktMDQtMjQuCgpPdXIgcGxhbm5lZCBzYW1wbGUgd2FzIDMwMCBwYXJ0aWNpcGFudHM7IGJhc2VkIG9uIFN0dWR5IDIsIHdlIGluaXRpYWxseSByZWNydWl0ZWQgMzUyIHBhcnRpY2lwYW50cy4gQWZ0ZXIgZmlsdGVyaW5nIG91dCBwYXJ0aWNpcGFudHMgd2hvIGZhaWxlZCBhdCBsZWFzdCBvbmUgb2Ygb3VyIGF0dGVudGlvbiBjaGVja3MsIHdlIGVuZGVkIHVwIHJldGFpbmluZyBgciBucm93KGQpYCBwYXJ0aWNpcGFudHMgKHJldGVudGlvbiByYXRlOiBgciByb3VuZChucm93KGQpLzM1MiwgMykqMTAwYCUpLCBidXQgYXQgdGhpcyBwb2ludCB3ZSBoYXZlIF9ub3RfIHN1cHBsZW1lbnRlZCB3aXRoIGFkZGl0aW9uYWwgcmVjcnVpdGluZy4gQXQgZWFjaCBzdGFnZSwgd2UgcmVjcnVpdGVkIHdvbWVuIGFuZCBtZW4gdGhyb3VnaCBzZXBhcmF0ZSBzdHVkaWVzLCBpbiBob3BlcyBvZiBhY3F1aXJpbmcgYSByb3VnaGx5IGVxdWFsIHNwbGl0IGJldHdlZW4gZ2VuZGVycy4KCkluIHRoZSBlbmQsIHdlIGVuZGVkIHVwIHdpdGggYSBzYW1wbGUgb2YgYHIgbnJvdyhkKWAgcGFydGljaXBhbnRzIHdobyBwYXNzZWQgb3VyIGF0dGVudGlvbiBjaGVja3MsIGByIG5yb3coZF9ub2R1cClgIG9mIHdob20gY2FtZSBmcm9tIHVuaXF1ZSBHUFMgY29vcmRpbmF0ZXMgKGByIHJvdW5kKG5yb3coZF9ub2R1cCkvbnJvdyhkKSwgMykqMTAwYCUpLgoKKipGb3IgdGhpcyBmaXJzdCBwYXNzLCB0aGVzZSBkYXRhIF9pbmNsdWRlXyBwYXJ0aWNpcGFudHMgd2hlcmUgdGhlcmUgaXMgYW5vdGhlciBwYXJ0aWNpcGFudCB3aXRoIGFuIGlkZW50aWNhbCBzZXQgb2YgR1BTIGNvb3JkaW5hdGVzIGFzIHJlY29yZGVkIGJ5IFF1YWx0cmljcy4qKgoKRWFjaCBwYXJ0aWNpcGFudCBhc3Nlc3NlZCBjaGlsZHJlbidzIG1lbnRhbCBjYXBhY2l0aWVzIGF0IDEzIHRhcmdldCBhZ2VzIGJldHdlZW4gdGhlIGFnZXMgb2YgMCBhbmQgNSB5ZWFycy4gRm9yIGVhY2ggdGFyZ2V0LCB0aGV5IHJhdGVkIDggbWVudGFsIGNhcGFjaXRpZXMgb24gYSBzY2FsZSBmcm9tIDAgKG5vdCBhdCBhbGwgY2FwYWJsZSkgdG8gMTAwIChjb21wbGV0ZWx5IGNhcGFibGUpLiBJbiBjb250cmFzdCB0byBTdHVkeSAyLCBwYXJ0aWNpcGFudHMgY29tcGxldGVkIGFsbCAxMyByYXRpbmdzIG9mIGEgcGFydGljdWxhciBtZW50YWwgY2FwYWNpdHkgb24gYSBzaW5nbGUgInRyaWFsIiAocmF0aGVyIHRoYW4gY29tcGxldGluZyBhbGwgOCByYXRpbmdzIG9mIGEgcGFydGljdWxhciB0YXJnZXQgYWdlIG9uIGEgc2luZ2xlIHRyaWFsKS4gSW4gYWRkaXRpb24sIHBhcnRpY2lwYW50cyBhbnN3ZXJlZCBxdWVzdGlvbnMgYWJvdXQgdGhlICJkZXZlbG9wbWVudGFsIGZhY3RvcnMiIHRoYXQgbWlnaHQgY29udHJpYnV0ZSB0byBkZXZlbG9wbWVudCBpbiB0aGlzIGRvbWFpbi4KCkZvciBtb3JlIGRldGFpbHMgYWJvdXQgdGhlIHN0dWR5LCBzZWUgb3VyIHByZXJlZ2lzdHJhdGlvbiBbaGVyZV0oaHR0cHM6Ly9vc2YuaW8veGg4Y2UpLiAKCiMgU3R1ZHkgMSBFRkEKCmBgYHtyfQojIGxvYWQgaW4gRUZBIHJlc3VsdHMgZnJvbSBzdHVkeSAxCmVmYV9TMSA8LSByZWFkUkRTKCIuLi9zdHVkeSAxL3MxX2VmYS5yZHMiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMS41fQpoZWF0bWFwX2Z1bihlZmFfUzEpICsgCiAgbGFicyh0aXRsZSA9IHBhc3RlMCgiU1RVRFkgMSBQYXJhbGxlbCBBbmFseXNpcyAocm90YXRpb246ICIsIGNob3Nlbl9yb3QsICIpIiksCiAgICAgICBzdWJ0aXRsZSA9ICInJSB2YXIuJyBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvZiBzaGFyZWQgdmFyaWFuY2UgZXhwbGFpbmVkICh0b3RhbCA9IDEwMCUpIikKYGBgCgojIFBsb3RzOiBDYXBhY2l0eSByYXRpbmdzIGFzIGEgZnVuY3Rpb24gb2YgdGFyZ2V0IGFnZSBhbmQgZG9tYWluCgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuN30KZ2dwbG90KGRfY2FwX3JhdGluZyAlPiUKICAgICAgICAgYXJyYW5nZShSZXNwb25zZUlkLCBkb21haW4sIGNhcGFjaXR5LCB0YXJnZXRfb3JkKSAlPiUKICAgICAgICAgbXV0YXRlKGRvbWFpbiA9IHJlY29kZV9mYWN0b3IoCiAgICAgICAgICAgZG9tYWluLAogICAgICAgICAgICJCT0QiID0gIkJvZGlseSBzZW5zYXRpb25zIiwKICAgICAgICAgICAiTkVHIiA9ICJOZWdhdGl2ZSBlbW90aW9ucyIsCiAgICAgICAgICAgIlBPUyIgPSAiU29jaWFsIGFiaWxpdGllcyAmIHBvc2l0aXZlIGVtb3Rpb25zIiwKICAgICAgICAgICAiQ09HIiA9ICJDb2duaXRpb24gJiBjb250cm9sIiwKICAgICAgICAgICAuZGVmYXVsdCA9IE5BX2NoYXJhY3Rlcl8pLAogICAgICAgICAgIGNhcGFjaXR5ID0gZ3N1YigiXyIsICIgIiwgY2FwYWNpdHkpKSwKICAgICAgIGFlcyh4ID0gdGFyZ2V0X251bSwgeSA9IHJlc3BvbnNlLCBncm91cCA9IFJlc3BvbnNlSWQsCiAgICAgICAgICAgY29sb3IgPSBkb21haW4pKSArCiAgZmFjZXRfd3JhcCh+IGRvbWFpbiB+IGNhcGFjaXR5LCBuY29sID0gNCkgKwogIGdlb21fcGF0aChhbHBoYSA9IDAuMSkgKwogIGdlb21fc21vb3RoKGFlcyhncm91cCA9IGNhcGFjaXR5KSwgCiAgICAgICAgICAgICAgbWV0aG9kID0gImxvZXNzIiwgCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGFzLm51bWVyaWMobGV2ZWxzKGZhY3RvcihkX2NhcF9yYXRpbmckdGFyZ2V0X251bSkpKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gbGV2ZWxzKGRfY2FwX3JhdGluZyR0YXJnZXRfb3JkKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIlBlcmNlcHRpb25zIG9mIGRldmVsb3BtZW50LCBieSBkb21haW4iLAogICAgICAgc3VidGl0bGUgPSAiQmxhY2sgbGluZSA9IGxvZXNzIHNtb290aGluZyIsCiAgICAgICB4ID0gIlRhcmdldCBhZ2UgKG51bWVyaWMpIiwKICAgICAgIHkgPSAiUmVzcG9uc2UgKDAgPSBub3QgYXQgYWxsIGNhcGFibGUsIDEwMCA9IGNvbXBsZXRlbHkgY2FwYWJsZSkiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC43fQpnZ3Bsb3QoZF9jYXBfcmF0aW5nICU+JQogICAgICAgICBhcnJhbmdlKFJlc3BvbnNlSWQsIGRvbWFpbiwgY2FwYWNpdHksIHRhcmdldF9vcmQpICU+JQogICAgICAgICBtdXRhdGUoZG9tYWluID0gcmVjb2RlX2ZhY3RvcigKICAgICAgICAgICBkb21haW4sCiAgICAgICAgICAgIkJPRCIgPSAiQm9kaWx5IHNlbnNhdGlvbnMiLAogICAgICAgICAgICJORUciID0gIk5lZ2F0aXZlIGVtb3Rpb25zIiwKICAgICAgICAgICAiUE9TIiA9ICJTb2NpYWwgYWJpbGl0aWVzICYgcG9zaXRpdmUgZW1vdGlvbnMiLAogICAgICAgICAgICJDT0ciID0gIkNvZ25pdGlvbiAmIGNvbnRyb2wiLAogICAgICAgICAgIC5kZWZhdWx0ID0gTkFfY2hhcmFjdGVyXyksCiAgICAgICAgICAgY2FwYWNpdHkgPSBnc3ViKCJfIiwgIiAiLCBjYXBhY2l0eSkpLAogICAgICAgYWVzKHggPSBzcXJ0KHRhcmdldF9udW0pLCB5ID0gcmVzcG9uc2UsIGdyb3VwID0gUmVzcG9uc2VJZCwKICAgICAgICAgICBjb2xvciA9IGRvbWFpbikpICsKICBmYWNldF93cmFwKH4gZG9tYWluIH4gY2FwYWNpdHksIG5jb2wgPSA0KSArCiAgZ2VvbV9wYXRoKGFscGhhID0gMC4xKSArCiAgZ2VvbV9zbW9vdGgoYWVzKGdyb3VwID0gY2FwYWNpdHkpLCAKICAgICAgICAgICAgICBtZXRob2QgPSAibG9lc3MiLCAKICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc3FydChhcy5udW1lcmljKGxldmVscyhmYWN0b3IoZF9jYXBfcmF0aW5nJHRhcmdldF9udW0pKSkpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBsZXZlbHMoZF9jYXBfcmF0aW5nJHRhcmdldF9vcmQpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiUGVyY2VwdGlvbnMgb2YgZGV2ZWxvcG1lbnQsIGJ5IGRvbWFpbiIsCiAgICAgICBzdWJ0aXRsZSA9ICJCbGFjayBsaW5lID0gbG9lc3Mgc21vb3RoaW5nIiwKICAgICAgIHggPSAiVGFyZ2V0IGFnZSAobnVtZXJpYywgc3F1YXJlLXJvb3QgdHJhbnNmb3JtZWQpIiwKICAgICAgIHkgPSAiUmVzcG9uc2UgKDAgPSBub3QgYXQgYWxsIGNhcGFibGUsIDEwMCA9IGNvbXBsZXRlbHkgY2FwYWJsZSkiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC43fQpnZ3Bsb3QoZF9jYXBfcmF0aW5nICU+JQogICAgICAgICBhcnJhbmdlKFJlc3BvbnNlSWQsIGRvbWFpbiwgY2FwYWNpdHksIHRhcmdldF9vcmQpICU+JQogICAgICAgICBtdXRhdGUoZG9tYWluID0gcmVjb2RlX2ZhY3RvcigKICAgICAgICAgICBkb21haW4sCiAgICAgICAgICAgIkJPRCIgPSAiQm9kaWx5IHNlbnNhdGlvbnMiLAogICAgICAgICAgICJORUciID0gIk5lZ2F0aXZlIGVtb3Rpb25zIiwKICAgICAgICAgICAiUE9TIiA9ICJTb2NpYWwgYWJpbGl0aWVzICYgcG9zaXRpdmUgZW1vdGlvbnMiLAogICAgICAgICAgICJDT0ciID0gIkNvZ25pdGlvbiAmIGNvbnRyb2wiLAogICAgICAgICAgIC5kZWZhdWx0ID0gTkFfY2hhcmFjdGVyXyksCiAgICAgICAgICAgY2FwYWNpdHkgPSBnc3ViKCJfIiwgIiAiLCBjYXBhY2l0eSkpLAogICAgICAgYWVzKHggPSB0YXJnZXRfb3JkLCB5ID0gcmVzcG9uc2UsIGdyb3VwID0gUmVzcG9uc2VJZCwKICAgICAgICAgICBjb2xvciA9IGRvbWFpbikpICsKICBmYWNldF93cmFwKH4gZG9tYWluIH4gY2FwYWNpdHksIG5jb2wgPSA0KSArCiAgZ2VvbV9wYXRoKGFscGhhID0gMC4xKSArCiAgZ2VvbV9zbW9vdGgoYWVzKGdyb3VwID0gY2FwYWNpdHkpLCAKICAgICAgICAgICAgICBtZXRob2QgPSAibG9lc3MiLCAKICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJQZXJjZXB0aW9ucyBvZiBkZXZlbG9wbWVudCwgYnkgZG9tYWluIiwKICAgICAgIHN1YnRpdGxlID0gIkJsYWNrIGxpbmUgPSBsb2VzcyBzbW9vdGhpbmciLAogICAgICAgeCA9ICJUYXJnZXQgYWdlIChvcmRpbmFsKSIsCiAgICAgICB5ID0gIlJlc3BvbnNlICgwID0gbm90IGF0IGFsbCBjYXBhYmxlLCAxMDAgPSBjb21wbGV0ZWx5IGNhcGFibGUpIikKYGBgCgoKIyBSZWdyZXNzaW9uIG1vZGVscywgdmVyc2lvbiAxOiBDYXBhY2l0eSByYXRpbmdzIGFzIGEgZnVuY3Rpb24gb2YgdGFyZ2V0IGFnZSBhbmQgZG9tYWluCgpgYGB7cn0KY29udHJhc3RzX2RvbWFpbl9lZmZfbm9DT0cgPC0gY2JpbmQoQk9EID0gYygxLCAtMSwgMCwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FRyA9IGMoMCwgLTEsIDEsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1MgPSBjKDAsIC0xLCAwLCAxKSkKY29udHJhc3RzX2RvbWFpbl9lZmZfbm9QT1MgPC0gY2JpbmQoQk9EID0gYygxLCAwLCAwLCAtMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FRyA9IGMoMCwgMCwgMSwgLTEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0cgPSBjKDAsIDEsIDAsIC0xKSkKY29udHJhc3RzX2RvbWFpbl9lZmZfbm9ORUcgPC0gY2JpbmQoQk9EID0gYygxLCAwLCAtMSwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPUyA9IGMoMCwgMCwgLTEsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0cgPSBjKDAsIDEsIC0xLCAwKSkKY29udHJhc3RzX2RvbWFpbl9lZmZfbm9CT0QgPC0gY2JpbmQoUE9TID0gYygtMSwgMCwgMCwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FRyA9IGMoLTEsIDAsIDEsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0cgPSBjKC0xLCAxLCAwLCAwKSkKYGBgCgojIyBUYXJnZXQgYWdlIGluIG1vbnRocwoKIyMjIEVmZmVjdC1jb2RlZCAoY29tcGFyaW5nIGFsbCBkb21haW5zIHRvIHRoZSBncmFuZCBtZWFuLCBleGNlcHQgImJvZGlseSBzZW5zYXRpb25zIikKCiMjIyMgTGluZWFyIGVmZmVjdHMgb25seQoKYGBge3J9CiMgcjFfbm9CT0QgPC0gbG1lcihyZXNwb25zZSB+IHRhcmdldF9udW0gKiBkb21haW4KIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gKyBkb21haW4gfCBSZXNwb25zZUlkKSAKIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMiksCiMgICAgICAgICAgICAgICAgICBjb250cmFzdHMgPSBsaXN0KGRvbWFpbiA9IGNvbnRyYXN0c19kb21haW5fZWZmX25vQk9EKSkKIyBzYXZlUkRTKHIxX25vQk9ELCAiLi9tb2RlbHMvcjFfbm9CT0QuUkRTIikKCnIxX25vQk9EIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3IxX25vQk9ELlJEUyIpCnN1bW1hcnkocjFfbm9CT0QsIGNvcnIgPSBGKQpgYGAKCiMjIyMgTm9uLWxpbmVhciBlZmZlY3RzCgpgYGB7cn0KIyByMl9ub0JPRCA8LSBsbWVyKHJlc3BvbnNlIH4gcG9seSh0YXJnZXRfbnVtLCAzKSAqIGRvbWFpbgojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSArIGRvbWFpbiB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpLAojICAgICAgICAgICAgICAgICAgY29udHJhc3RzID0gbGlzdChkb21haW4gPSBjb250cmFzdHNfZG9tYWluX2VmZl9ub0JPRCkpCiMgc2F2ZVJEUyhyMl9ub0JPRCwgIi4vbW9kZWxzL3IyX25vQk9ELlJEUyIpCgpyMl9ub0JPRCA8LSByZWFkUkRTKCIuL21vZGVscy9yMl9ub0JPRC5SRFMiKQpzdW1tYXJ5KHIyX25vQk9ELCBjb3JyID0gRikKYGBgCgojIyMgRWZmZWN0LWNvZGVkIChjb21wYXJpbmcgYWxsIGRvbWFpbnMgdG8gdGhlIGdyYW5kIG1lYW4sIGV4Y2VwdCAibmVnYXRpdmUgZW1vdGlvbnMiKQoKIyMjIyBMaW5lYXIgZWZmZWN0cyBvbmx5CgpgYGB7cn0KIyByMV9ub05FRyA8LSBsbWVyKHJlc3BvbnNlIH4gdGFyZ2V0X251bSAqIGRvbWFpbgojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSArIGRvbWFpbiB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpLAojICAgICAgICAgICAgICAgICAgY29udHJhc3RzID0gbGlzdChkb21haW4gPSBjb250cmFzdHNfZG9tYWluX2VmZl9ub05FRykpCiMgc2F2ZVJEUyhyMV9ub05FRywgIi4vbW9kZWxzL3IxX25vTkVHLlJEUyIpCgpyMV9ub05FRyA8LSByZWFkUkRTKCIuL21vZGVscy9yMV9ub05FRy5SRFMiKQpzdW1tYXJ5KHIxX25vTkVHLCBjb3JyID0gRikKYGBgCgojIyMjIE5vbi1saW5lYXIgZWZmZWN0cwoKYGBge3J9CiMgcjJfbm9ORUcgPC0gbG1lcihyZXNwb25zZSB+IHBvbHkodGFyZ2V0X251bSwgMykgKiBkb21haW4KIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gKyBkb21haW4gfCBSZXNwb25zZUlkKQojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSB8IGNhcGFjaXR5KSwKIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSwKIyAgICAgICAgICAgICAgICAgIGNvbnRyYXN0cyA9IGxpc3QoZG9tYWluID0gY29udHJhc3RzX2RvbWFpbl9lZmZfbm9ORUcpKQojIHNhdmVSRFMocjJfbm9ORUcsICIuL21vZGVscy9yMl9ub05FRy5SRFMiKQoKcjJfbm9ORUcgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjJfbm9ORUcuUkRTIikKc3VtbWFyeShyMl9ub05FRywgY29yciA9IEYpCmBgYAoKIyMjIEVmZmVjdC1jb2RlZCAoY29tcGFyaW5nIGFsbCBkb21haW5zIHRvIHRoZSBncmFuZCBtZWFuLCBleGNlcHQgInNvY2lhbCBhYmlsaXRpZXMgJiBwb3NpdGl2ZSBlbW90aW9ucyIpCgojIyMjIExpbmVhciBlZmZlY3RzIG9ubHkKCmBgYHtyfQojIHIxX25vUE9TIDwtIGxtZXIocmVzcG9uc2UgfiB0YXJnZXRfbnVtICogZG9tYWluCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtICsgZG9tYWluIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMiksCiMgICAgICAgICAgICAgICAgICBjb250cmFzdHMgPSBsaXN0KGRvbWFpbiA9IGNvbnRyYXN0c19kb21haW5fZWZmX25vUE9TKSkKIyBzYXZlUkRTKHIxX25vUE9TLCAiLi9tb2RlbHMvcjFfbm9QT1MuUkRTIikKCnIxX25vUE9TIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3IxX25vUE9TLlJEUyIpCnN1bW1hcnkocjFfbm9QT1MsIGNvcnIgPSBGKQpgYGAKCiMjIyMgTm9uLWxpbmVhciBlZmZlY3RzCgpgYGB7cn0KIyByMl9ub1BPUyA8LSBsbWVyKHJlc3BvbnNlIH4gcG9seSh0YXJnZXRfbnVtLCAzKSAqIGRvbWFpbgojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSArIGRvbWFpbiB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpLAojICAgICAgICAgICAgICAgICAgY29udHJhc3RzID0gbGlzdChkb21haW4gPSBjb250cmFzdHNfZG9tYWluX2VmZl9ub1BPUykpCiMgc2F2ZVJEUyhyMl9ub1BPUywgIi4vbW9kZWxzL3IyX25vUE9TLlJEUyIpCgpyMl9ub1BPUyA8LSByZWFkUkRTKCIuL21vZGVscy9yMl9ub1BPUy5SRFMiKQpzdW1tYXJ5KHIyX25vUE9TLCBjb3JyID0gRikKYGBgCgojIyMgRWZmZWN0LWNvZGVkIChjb21wYXJpbmcgYWxsIGRvbWFpbnMgdG8gdGhlIGdyYW5kIG1lYW4sIGV4Y2VwdCAiY29nbml0aW9uICYgY29udHJvbCIpCgojIyMjIExpbmVhciBlZmZlY3RzIG9ubHkKCmBgYHtyfQojIHIxX25vQ09HIDwtIGxtZXIocmVzcG9uc2UgfiB0YXJnZXRfbnVtICogZG9tYWluCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtICsgZG9tYWluIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMiksCiMgICAgICAgICAgICAgICAgICBjb250cmFzdHMgPSBsaXN0KGRvbWFpbiA9IGNvbnRyYXN0c19kb21haW5fZWZmX25vQ09HKSkKIyBzYXZlUkRTKHIxX25vQ09HLCAiLi9tb2RlbHMvcjFfbm9DT0cuUkRTIikKCnIxX25vQ09HIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3IxX25vQ09HLlJEUyIpCnN1bW1hcnkocjFfbm9DT0csIGNvcnIgPSBGKQpgYGAKCiMjIyMgTm9uLWxpbmVhciBlZmZlY3RzCgpgYGB7cn0KIyByMl9ub0NPRyA8LSBsbWVyKHJlc3BvbnNlIH4gcG9seSh0YXJnZXRfbnVtLCAzKSAqIGRvbWFpbgojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSArIGRvbWFpbiB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpLAojICAgICAgICAgICAgICAgICAgY29udHJhc3RzID0gbGlzdChkb21haW4gPSBjb250cmFzdHNfZG9tYWluX2VmZl9ub0NPRykpCiMgc2F2ZVJEUyhyMl9ub0NPRywgIi4vbW9kZWxzL3IyX25vQ09HLlJEUyIpCgpyMl9ub0NPRyA8LSByZWFkUkRTKCIuL21vZGVscy9yMl9ub0NPRy5SRFMiKQpzdW1tYXJ5KHIyX25vQ09HLCBjb3JyID0gRikKYGBgCgojIyBUYXJnZXQgYWdlIGluIG1vbnRocyAoc3F1YXJlLXJvb3QgdHJhbnNmb3JtYXRpb24pCgoqKk5PVEU6IEFsbCBvZiB0aGVzZSBtb2RlbHMgZmFpbCB0byBtZWV0IG91ciBjcml0ZXJpb24gb2YgcmFuZG9tIGVmZmVjdHMgYmVpbmcgY29ycmVsYXRpb24gPCAwLjkwLioqIEJlY2F1c2Ugb2YgdGhpcywgSSBoYXZlIG5vdCBpbmNsdWRlZCBpbiB0aGlzIHByaW50LW91dCBhbmQgSSBoYXZlIG5vdCB5ZXQgbW9kZWxlZCBub24tbGluZWFyIGVmZmVjdHMgYWZ0ZXIgc3F1YXJlLXJvb3QgdHJhbnNmb3JtYXRpb24uIFRoZSBuZXh0IHN0ZXAgd2lsbCBiZSB0byB0cnkgc2ltcGxlciByYW5kb20gZWZmZWN0cyBtb2RlbHMgKHdpdGggZmV3ZXIgcmFuZG9tIHNsb3BlcykuCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CiMgcjNfbm9CT0QgPC0gbG1lcihyZXNwb25zZSB+IHNxcnQodGFyZ2V0X251bSkgKiBkb21haW4KIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gKyBkb21haW4gfCBSZXNwb25zZUlkKQojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSB8IGNhcGFjaXR5KSwKIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSwKIyAgICAgICAgICAgICAgICAgIGNvbnRyYXN0cyA9IGxpc3QoZG9tYWluID0gY29udHJhc3RzX2RvbWFpbl9lZmZfbm9CT0QpKQojIHNhdmVSRFMocjNfbm9CT0QsICIuL21vZGVscy9yM19ub0JPRC5SRFMiKQoKcjNfbm9CT0QgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjNfbm9CT0QuUkRTIikKc3VtbWFyeShyM19ub0JPRCwgY29yciA9IEYpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGfQojICMgcjRfbm9CT0QgPC0gbG1lcihyZXNwb25zZSB+IHBvbHkoc3FydCh0YXJnZXRfbnVtKSwgMykgKiBkb21haW4KIyAjICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSArIGRvbWFpbiB8IFJlc3BvbnNlSWQpCiMgIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAjICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpLAojICMgICAgICAgICAgICAgICAgICBjb250cmFzdHMgPSBsaXN0KGRvbWFpbiA9IGNvbnRyYXN0c19kb21haW5fZWZmX25vQk9EKSkKIyAjIHNhdmVSRFMocjRfbm9CT0QsICIuL21vZGVscy9yNF9ub0JPRC5SRFMiKQojIAojIHI0X25vQk9EIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I0X25vQk9ELlJEUyIpCiMgc3VtbWFyeShyNF9ub0JPRCwgY29yciA9IEYpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGfQojIHIzX25vTkVHIDwtIGxtZXIocmVzcG9uc2UgfiBzcXJ0KHRhcmdldF9udW0pICogZG9tYWluCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtICsgZG9tYWluIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMiksCiMgICAgICAgICAgICAgICAgICBjb250cmFzdHMgPSBsaXN0KGRvbWFpbiA9IGNvbnRyYXN0c19kb21haW5fZWZmX25vTkVHKSkKIyBzYXZlUkRTKHIzX25vTkVHLCAiLi9tb2RlbHMvcjNfbm9ORUcuUkRTIikKCnIzX25vTkVHIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3IzX25vTkVHLlJEUyIpCnN1bW1hcnkocjNfbm9ORUcsIGNvcnIgPSBGKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRn0KIyAjIHI0X25vTkVHIDwtIGxtZXIocmVzcG9uc2UgfiBwb2x5KHNxcnQodGFyZ2V0X251bSksIDMpICogZG9tYWluCiMgIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gKyBkb21haW4gfCBSZXNwb25zZUlkKQojICMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgIyAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSwKIyAjICAgICAgICAgICAgICAgICAgY29udHJhc3RzID0gbGlzdChkb21haW4gPSBjb250cmFzdHNfZG9tYWluX2VmZl9ub05FRykpCiMgIyBzYXZlUkRTKHI0X25vTkVHLCAiLi9tb2RlbHMvcjRfbm9ORUcuUkRTIikKIyAKIyByNF9ub05FRyA8LSByZWFkUkRTKCIuL21vZGVscy9yNF9ub05FRy5SRFMiKQojIHN1bW1hcnkocjRfbm9ORUcsIGNvcnIgPSBGKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRn0KIyByM19ub1BPUyA8LSBsbWVyKHJlc3BvbnNlIH4gc3FydCh0YXJnZXRfbnVtKSAqIGRvbWFpbgojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSArIGRvbWFpbiB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpLAojICAgICAgICAgICAgICAgICAgY29udHJhc3RzID0gbGlzdChkb21haW4gPSBjb250cmFzdHNfZG9tYWluX2VmZl9ub1BPUykpCiMgc2F2ZVJEUyhyM19ub1BPUywgIi4vbW9kZWxzL3IzX25vUE9TLlJEUyIpCgpyM19ub1BPUyA8LSByZWFkUkRTKCIuL21vZGVscy9yM19ub1BPUy5SRFMiKQpzdW1tYXJ5KHIzX25vUE9TLCBjb3JyID0gRikKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CiMgIyByNF9ub1BPUyA8LSBsbWVyKHJlc3BvbnNlIH4gcG9seShzcXJ0KHRhcmdldF9udW0pLCAzKSAqIGRvbWFpbgojICMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtICsgZG9tYWluIHwgUmVzcG9uc2VJZCkKIyAjICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSB8IGNhcGFjaXR5KSwKIyAjICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMiksCiMgIyAgICAgICAgICAgICAgICAgIGNvbnRyYXN0cyA9IGxpc3QoZG9tYWluID0gY29udHJhc3RzX2RvbWFpbl9lZmZfbm9QT1MpKQojICMgc2F2ZVJEUyhyNF9ub1BPUywgIi4vbW9kZWxzL3I0X25vUE9TLlJEUyIpCiMgCiMgcjRfbm9QT1MgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjRfbm9QT1MuUkRTIikKIyBzdW1tYXJ5KHI0X25vUE9TLCBjb3JyID0gRikKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CiMgcjNfbm9DT0cgPC0gbG1lcihyZXNwb25zZSB+IHNxcnQodGFyZ2V0X251bSkgKiBkb21haW4KIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gKyBkb21haW4gfCBSZXNwb25zZUlkKQojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSB8IGNhcGFjaXR5KSwKIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSwKIyAgICAgICAgICAgICAgICAgIGNvbnRyYXN0cyA9IGxpc3QoZG9tYWluID0gY29udHJhc3RzX2RvbWFpbl9lZmZfbm9DT0cpKQojIHNhdmVSRFMocjNfbm9DT0csICIuL21vZGVscy9yM19ub0NPRy5SRFMiKQoKcjNfbm9DT0cgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjNfbm9DT0cuUkRTIikKc3VtbWFyeShyM19ub0NPRywgY29yciA9IEYpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGfQojICMgcjRfbm9DT0cgPC0gbG1lcihyZXNwb25zZSB+IHBvbHkoc3FydCh0YXJnZXRfbnVtKSwgMykgKiBkb21haW4KIyAjICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSArIGRvbWFpbiB8IFJlc3BvbnNlSWQpCiMgIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAjICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpLAojICMgICAgICAgICAgICAgICAgICBjb250cmFzdHMgPSBsaXN0KGRvbWFpbiA9IGNvbnRyYXN0c19kb21haW5fZWZmX25vQ09HKSkKIyAjIHNhdmVSRFMocjRfbm9DT0csICIuL21vZGVscy9yNF9ub0NPRy5SRFMiKQojIAojIHI0X25vQ09HIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I0X25vQ09HLlJEUyIpCiMgc3VtbWFyeShyNF9ub0NPRywgY29yciA9IEYpCmBgYAoKCiMgUmVncmVzc2lvbiBtb2RlbHMsIHZlcnNpb24gMjogQ2FwYWNpdHkgcmF0aW5ncyBhcyBhIGZ1bmN0aW9uIG9mIHRhcmdldCBhZ2UsIGZvciBlYWNoIGRvbWFpbiBzZXBhcmF0ZWx5CgoqKk5PVEU6IEFsbCBvZiB0aGUgcHJlcmVnaXN0ZXJlZCBtb2RlbHMgZmFpbCB0byBtZWV0IG91ciBjcml0ZXJpb24gb2YgcmFuZG9tIGVmZmVjdHMgYmVpbmcgY29ycmVsYXRpb24gPCAwLjkwLioqIEJlY2F1c2Ugb2YgdGhpcywgSSBpbnN0ZWFkIHVzZWQgc2ltcGxlciByYW5kb20gZWZmZWN0cyBtb2RlbHMgKHdpdGggZmV3ZXIgcmFuZG9tIHNsb3BlcyksIGFzIGluZGljYXRlZCBpbiB0aGUgcHJlcmVnaXN0cmF0aW9uLgoKIyMgVGFyZ2V0IGFnZSBpbiBtb250aHMKCiMjIyBCb2RpbHkgc2Vuc2F0aW9ucwoKIyMjIyBMaW5lYXIgZWZmZWN0cyBvbmx5CgpgYGB7ciwgaW5jbHVkZSA9IEZ9CiMgcjVfQk9EIDwtIGxtZXIocmVzcG9uc2UgfiB0YXJnZXRfbnVtCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIkJPRCIpKQojIHNhdmVSRFMocjVfQk9ELCAiLi9tb2RlbHMvcjVfQk9ELlJEUyIpCgpyNV9CT0QgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjVfQk9ELlJEUyIpCnN1bW1hcnkocjVfQk9ELCBjb3JyID0gRikKYGBgCgpgYGB7cn0KIyByNWFfQk9EIDwtIGxtZXIocmVzcG9uc2UgfiB0YXJnZXRfbnVtCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKDEgfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIkJPRCIpKQojIHNhdmVSRFMocjVhX0JPRCwgIi4vbW9kZWxzL3I1YV9CT0QuUkRTIikKCnI1YV9CT0QgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjVhX0JPRC5SRFMiKQpzdW1tYXJ5KHI1YV9CT0QsIGNvcnIgPSBGKQpgYGAKCiMjIyMgTm9uLWxpbmVhciBlZmZlY3RzCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CiMgcjZfQk9EIDwtIGxtZXIocmVzcG9uc2UgfiBwb2x5KHRhcmdldF9udW0sIDMpCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIkJPRCIpKQojIHNhdmVSRFMocjZfQk9ELCAiLi9tb2RlbHMvcjZfQk9ELlJEUyIpCgpyNl9CT0QgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjZfQk9ELlJEUyIpCnN1bW1hcnkocjZfQk9ELCBjb3JyID0gRikKYGBgCgpgYGB7cn0KIyByNmFfQk9EIDwtIGxtZXIocmVzcG9uc2UgfiBwb2x5KHRhcmdldF9udW0sIDMpCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKDEgfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIkJPRCIpKQojIHNhdmVSRFMocjZhX0JPRCwgIi4vbW9kZWxzL3I2YV9CT0QuUkRTIikKCnI2YV9CT0QgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjZhX0JPRC5SRFMiKQpzdW1tYXJ5KHI2YV9CT0QsIGNvcnIgPSBGKQpgYGAKCiMjIyBOZWdhdGl2ZSBlbW90aW9ucwoKIyMjIyBMaW5lYXIgZWZmZWN0cyBvbmx5CgpgYGB7ciwgaW5jbHVkZSA9IEZ9CiMgcjVfTkVHIDwtIGxtZXIocmVzcG9uc2UgfiB0YXJnZXRfbnVtCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIk5FRyIpKQojIHNhdmVSRFMocjVfTkVHLCAiLi9tb2RlbHMvcjVfTkVHLlJEUyIpCgpyNV9ORUcgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjVfTkVHLlJEUyIpCnN1bW1hcnkocjVfTkVHLCBjb3JyID0gRikKYGBgCgpgYGB7cn0KIyByNWFfTkVHIDwtIGxtZXIocmVzcG9uc2UgfiB0YXJnZXRfbnVtCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKDEgfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIk5FRyIpKQojIHNhdmVSRFMocjVhX05FRywgIi4vbW9kZWxzL3I1YV9ORUcuUkRTIikKCnI1YV9ORUcgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjVhX05FRy5SRFMiKQpzdW1tYXJ5KHI1YV9ORUcsIGNvcnIgPSBGKQpgYGAKCiMjIyMgTm9uLWxpbmVhciBlZmZlY3RzCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CiMgcjZfTkVHIDwtIGxtZXIocmVzcG9uc2UgfiBwb2x5KHRhcmdldF9udW0sIDMpCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIk5FRyIpKQojIHNhdmVSRFMocjZfTkVHLCAiLi9tb2RlbHMvcjZfTkVHLlJEUyIpCgpyNl9ORUcgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjZfTkVHLlJEUyIpCnN1bW1hcnkocjZfTkVHLCBjb3JyID0gRikKYGBgCgpgYGB7cn0KIyByNmFfTkVHIDwtIGxtZXIocmVzcG9uc2UgfiBwb2x5KHRhcmdldF9udW0sIDMpCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKDEgfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIk5FRyIpKQojIHNhdmVSRFMocjZhX05FRywgIi4vbW9kZWxzL3I2YV9ORUcuUkRTIikKCnI2YV9ORUcgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjZhX05FRy5SRFMiKQpzdW1tYXJ5KHI2YV9ORUcsIGNvcnIgPSBGKQpgYGAKCiMjIyBTb2NpYWwgYWJpbGl0aWVzICYgcG9zaXRpdmUgZW1vdGlvbnMKCiMjIyMgTGluZWFyIGVmZmVjdHMgb25seQoKYGBge3IsIGluY2x1ZGUgPSBGfQojIHI1X1BPUyA8LSBsbWVyKHJlc3BvbnNlIH4gdGFyZ2V0X251bQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJQT1MiKSkKIyBzYXZlUkRTKHI1X1BPUywgIi4vbW9kZWxzL3I1X1BPUy5SRFMiKQoKcjVfUE9TIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I1X1BPUy5SRFMiKQpzdW1tYXJ5KHI1X1BPUywgY29yciA9IEYpCmBgYAoKYGBge3J9CiMgcjVhX1BPUyA8LSBsbWVyKHJlc3BvbnNlIH4gdGFyZ2V0X251bQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICgxIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJQT1MiKSkKIyBzYXZlUkRTKHI1YV9QT1MsICIuL21vZGVscy9yNWFfUE9TLlJEUyIpCgpyNWFfUE9TIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I1YV9QT1MuUkRTIikKc3VtbWFyeShyNWFfUE9TLCBjb3JyID0gRikKYGBgCgojIyMjIE5vbi1saW5lYXIgZWZmZWN0cwoKYGBge3IsIGluY2x1ZGUgPSBGfQojIHI2X1BPUyA8LSBsbWVyKHJlc3BvbnNlIH4gcG9seSh0YXJnZXRfbnVtLCAzKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJQT1MiKSkKIyBzYXZlUkRTKHI2X1BPUywgIi4vbW9kZWxzL3I2X1BPUy5SRFMiKQoKcjZfUE9TIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I2X1BPUy5SRFMiKQpzdW1tYXJ5KHI2X1BPUywgY29yciA9IEYpCmBgYAoKYGBge3J9CiMgcjZhX1BPUyA8LSBsbWVyKHJlc3BvbnNlIH4gcG9seSh0YXJnZXRfbnVtLCAzKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICgxIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJQT1MiKSkKIyBzYXZlUkRTKHI2YV9QT1MsICIuL21vZGVscy9yNmFfUE9TLlJEUyIpCgpyNmFfUE9TIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I2YV9QT1MuUkRTIikKc3VtbWFyeShyNmFfUE9TLCBjb3JyID0gRikKYGBgCgojIyMgTmVnYXRpdmUgZW1vdGlvbnMKCiMjIyMgTGluZWFyIGVmZmVjdHMgb25seQoKYGBge3IsIGluY2x1ZGUgPSBGfQojIHI1X0NPRyA8LSBsbWVyKHJlc3BvbnNlIH4gdGFyZ2V0X251bQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJDT0ciKSkKIyBzYXZlUkRTKHI1X0NPRywgIi4vbW9kZWxzL3I1X0NPRy5SRFMiKQoKcjVfQ09HIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I1X0NPRy5SRFMiKQpzdW1tYXJ5KHI1X0NPRywgY29yciA9IEYpCmBgYAoKYGBge3J9CiMgcjVhX0NPRyA8LSBsbWVyKHJlc3BvbnNlIH4gdGFyZ2V0X251bQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICgxIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJDT0ciKSkKIyBzYXZlUkRTKHI1YV9DT0csICIuL21vZGVscy9yNWFfQ09HLlJEUyIpCgpyNWFfQ09HIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I1YV9DT0cuUkRTIikKc3VtbWFyeShyNWFfQ09HLCBjb3JyID0gRikKYGBgCgojIyMjIE5vbi1saW5lYXIgZWZmZWN0cwoKYGBge3IsIGluY2x1ZGUgPSBGfQojIHI2X0NPRyA8LSBsbWVyKHJlc3BvbnNlIH4gcG9seSh0YXJnZXRfbnVtLCAzKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJDT0ciKSkKIyBzYXZlUkRTKHI2X0NPRywgIi4vbW9kZWxzL3I2X0NPRy5SRFMiKQoKcjZfQ09HIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I2X0NPRy5SRFMiKQpzdW1tYXJ5KHI2X0NPRywgY29yciA9IEYpCmBgYAoKYGBge3J9CiMgcjZhX0NPRyA8LSBsbWVyKHJlc3BvbnNlIH4gcG9seSh0YXJnZXRfbnVtLCAzKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICgxIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJDT0ciKSkKIyBzYXZlUkRTKHI2YV9DT0csICIuL21vZGVscy9yNmFfQ09HLlJEUyIpCgpyNmFfQ09HIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I2YV9DT0cuUkRTIikKc3VtbWFyeShyNmFfQ09HLCBjb3JyID0gRikKYGBgCgojIyBUYXJnZXQgYWdlIGluIG1vbnRocyAoc3F1YXJlLXJvb3QgdHJhbnNmb3JtYXRpb24pCgojIyMgQm9kaWx5IHNlbnNhdGlvbnMKCiMjIyMgTGluZWFyIGVmZmVjdHMgb25seQoKYGBge3IsIGluY2x1ZGUgPSBGfQojIHI3X0JPRCA8LSBsbWVyKHJlc3BvbnNlIH4gc3FydCh0YXJnZXRfbnVtKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJCT0QiKSkKIyBzYXZlUkRTKHI3X0JPRCwgIi4vbW9kZWxzL3I3X0JPRC5SRFMiKQoKcjdfQk9EIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I3X0JPRC5SRFMiKQpzdW1tYXJ5KHI3X0JPRCwgY29yciA9IEYpCmBgYAoKYGBge3J9CiMgcjdhX0JPRCA8LSBsbWVyKHJlc3BvbnNlIH4gc3FydCh0YXJnZXRfbnVtKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICgxIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJCT0QiKSkKIyBzYXZlUkRTKHI3YV9CT0QsICIuL21vZGVscy9yN2FfQk9ELlJEUyIpCgpyN2FfQk9EIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I3YV9CT0QuUkRTIikKc3VtbWFyeShyN2FfQk9ELCBjb3JyID0gRikKYGBgCgojIyMjIE5vbi1saW5lYXIgZWZmZWN0cwoKYGBge3IsIGluY2x1ZGUgPSBGfQojIHI4X0JPRCA8LSBsbWVyKHJlc3BvbnNlIH4gcG9seShzcXJ0KHRhcmdldF9udW0pLCAzKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJCT0QiKSkKIyBzYXZlUkRTKHI4X0JPRCwgIi4vbW9kZWxzL3I4X0JPRC5SRFMiKQoKcjhfQk9EIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I4X0JPRC5SRFMiKQpzdW1tYXJ5KHI4X0JPRCwgY29yciA9IEYpCmBgYAoKYGBge3J9CiMgcjhhX0JPRCA8LSBsbWVyKHJlc3BvbnNlIH4gcG9seShzcXJ0KHRhcmdldF9udW0pLCAzKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICgxIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJCT0QiKSkKIyBzYXZlUkRTKHI4YV9CT0QsICIuL21vZGVscy9yOGFfQk9ELlJEUyIpCgpyOGFfQk9EIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I4YV9CT0QuUkRTIikKc3VtbWFyeShyOGFfQk9ELCBjb3JyID0gRikKYGBgCgojIyMgTmVnYXRpdmUgZW1vdGlvbnMKCiMjIyMgTGluZWFyIGVmZmVjdHMgb25seQoKYGBge3IsIGluY2x1ZGUgPSBGfQojIHI3X05FRyA8LSBsbWVyKHJlc3BvbnNlIH4gc3FydCh0YXJnZXRfbnVtKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJORUciKSkKIyBzYXZlUkRTKHI3X05FRywgIi4vbW9kZWxzL3I3X05FRy5SRFMiKQoKcjdfTkVHIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I3X05FRy5SRFMiKQpzdW1tYXJ5KHI3X05FRywgY29yciA9IEYpCmBgYAoKYGBge3J9CiMgcjdhX05FRyA8LSBsbWVyKHJlc3BvbnNlIH4gc3FydCh0YXJnZXRfbnVtKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICgxIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJORUciKSkKIyBzYXZlUkRTKHI3YV9ORUcsICIuL21vZGVscy9yN2FfTkVHLlJEUyIpCgpyN2FfTkVHIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I3YV9ORUcuUkRTIikKc3VtbWFyeShyN2FfTkVHLCBjb3JyID0gRikKYGBgCgojIyMjIE5vbi1saW5lYXIgZWZmZWN0cwoKYGBge3IsIGluY2x1ZGUgPSBGfQojIHI4X05FRyA8LSBsbWVyKHJlc3BvbnNlIH4gcG9seShzcXJ0KHRhcmdldF9udW0pLCAzKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJORUciKSkKIyBzYXZlUkRTKHI4X05FRywgIi4vbW9kZWxzL3I4X05FRy5SRFMiKQoKcjhfTkVHIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I4X05FRy5SRFMiKQpzdW1tYXJ5KHI4X05FRywgY29yciA9IEYpCmBgYAoKYGBge3J9CiMgcjhhX05FRyA8LSBsbWVyKHJlc3BvbnNlIH4gcG9seShzcXJ0KHRhcmdldF9udW0pLCAzKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICgxIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJORUciKSkKIyBzYXZlUkRTKHI4YV9ORUcsICIuL21vZGVscy9yOGFfTkVHLlJEUyIpCgpyOGFfTkVHIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I4YV9ORUcuUkRTIikKc3VtbWFyeShyOGFfTkVHLCBjb3JyID0gRikKYGBgCgojIyMgU29jaWFsIGFiaWxpdGllcyAmIHBvc2l0aXZlIGVtb3Rpb25zCgojIyMjIExpbmVhciBlZmZlY3RzIG9ubHkKCmBgYHtyLCBpbmNsdWRlID0gRn0KIyByN19QT1MgPC0gbG1lcihyZXNwb25zZSB+IHNxcnQodGFyZ2V0X251bSkKIyAgICAgICAgICAgICAgICAgICsgKDEgfCBSZXNwb25zZUlkKQojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSB8IGNhcGFjaXR5KSwKIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSAlPiUKIyAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGRvbWFpbiA9PSAiUE9TIikpCiMgc2F2ZVJEUyhyN19QT1MsICIuL21vZGVscy9yN19QT1MuUkRTIikKCnI3X1BPUyA8LSByZWFkUkRTKCIuL21vZGVscy9yN19QT1MuUkRTIikKc3VtbWFyeShyN19QT1MsIGNvcnIgPSBGKQpgYGAKCmBgYHtyfQojIHI3YV9QT1MgPC0gbG1lcihyZXNwb25zZSB+IHNxcnQodGFyZ2V0X251bSkKIyAgICAgICAgICAgICAgICAgICsgKDEgfCBSZXNwb25zZUlkKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IGNhcGFjaXR5KSwKIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSAlPiUKIyAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGRvbWFpbiA9PSAiUE9TIikpCiMgc2F2ZVJEUyhyN2FfUE9TLCAiLi9tb2RlbHMvcjdhX1BPUy5SRFMiKQoKcjdhX1BPUyA8LSByZWFkUkRTKCIuL21vZGVscy9yN2FfUE9TLlJEUyIpCnN1bW1hcnkocjdhX1BPUywgY29yciA9IEYpCmBgYAoKIyMjIyBOb24tbGluZWFyIGVmZmVjdHMKCmBgYHtyLCBpbmNsdWRlID0gRn0KIyByOF9QT1MgPC0gbG1lcihyZXNwb25zZSB+IHBvbHkoc3FydCh0YXJnZXRfbnVtKSwgMykKIyAgICAgICAgICAgICAgICAgICsgKDEgfCBSZXNwb25zZUlkKQojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSB8IGNhcGFjaXR5KSwKIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSAlPiUKIyAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGRvbWFpbiA9PSAiUE9TIikpCiMgc2F2ZVJEUyhyOF9QT1MsICIuL21vZGVscy9yOF9QT1MuUkRTIikKCnI4X1BPUyA8LSByZWFkUkRTKCIuL21vZGVscy9yOF9QT1MuUkRTIikKc3VtbWFyeShyOF9QT1MsIGNvcnIgPSBGKQpgYGAKCmBgYHtyfQojIHI4YV9QT1MgPC0gbG1lcihyZXNwb25zZSB+IHBvbHkoc3FydCh0YXJnZXRfbnVtKSwgMykKIyAgICAgICAgICAgICAgICAgICsgKDEgfCBSZXNwb25zZUlkKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IGNhcGFjaXR5KSwKIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSAlPiUKIyAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGRvbWFpbiA9PSAiUE9TIikpCiMgc2F2ZVJEUyhyOGFfUE9TLCAiLi9tb2RlbHMvcjhhX1BPUy5SRFMiKQoKcjhhX1BPUyA8LSByZWFkUkRTKCIuL21vZGVscy9yOGFfUE9TLlJEUyIpCnN1bW1hcnkocjhhX1BPUywgY29yciA9IEYpCmBgYAoKIyMjIENvZ25pdGlvbiAmIGNvbnRyb2wKCiMjIyMgTGluZWFyIGVmZmVjdHMgb25seQoKYGBge3IsIGluY2x1ZGUgPSBGfQojIHI3X0NPRyA8LSBsbWVyKHJlc3BvbnNlIH4gc3FydCh0YXJnZXRfbnVtKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJDT0ciKSkKIyBzYXZlUkRTKHI3X0NPRywgIi4vbW9kZWxzL3I3X0NPRy5SRFMiKQoKcjdfQ09HIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I3X0NPRy5SRFMiKQpzdW1tYXJ5KHI3X0NPRywgY29yciA9IEYpCmBgYAoKYGBge3J9CiMgcjdhX0NPRyA8LSBsbWVyKHJlc3BvbnNlIH4gc3FydCh0YXJnZXRfbnVtKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICgxIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJDT0ciKSkKIyBzYXZlUkRTKHI3YV9DT0csICIuL21vZGVscy9yN2FfQ09HLlJEUyIpCgpyN2FfQ09HIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I3YV9DT0cuUkRTIikKc3VtbWFyeShyN2FfQ09HLCBjb3JyID0gRikKYGBgCgojIyMjIE5vbi1saW5lYXIgZWZmZWN0cwoKYGBge3IsIGluY2x1ZGUgPSBGfQojIHI4X0NPRyA8LSBsbWVyKHJlc3BvbnNlIH4gcG9seShzcXJ0KHRhcmdldF9udW0pLCAzKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJDT0ciKSkKIyBzYXZlUkRTKHI4X0NPRywgIi4vbW9kZWxzL3I4X0NPRy5SRFMiKQoKcjhfQ09HIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I4X0NPRy5SRFMiKQpzdW1tYXJ5KHI4X0NPRywgY29yciA9IEYpCmBgYAoKYGBge3J9CiMgcjhhX0NPRyA8LSBsbWVyKHJlc3BvbnNlIH4gcG9seShzcXJ0KHRhcmdldF9udW0pLCAzKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICgxIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJDT0ciKSkKIyBzYXZlUkRTKHI4YV9DT0csICIuL21vZGVscy9yOGFfQ09HLlJEUyIpCgpyOGFfQ09HIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I4YV9DT0cuUkRTIikKc3VtbWFyeShyOGFfQ09HLCBjb3JyID0gRikKYGBgCgoKIyBQbG90czogUmF0aW5ncyBmb3IgZGV2ZWxvcG1lbnRhbCBmYWN0b3JzLCBieSBkb21haW4gYW5kIGNhcGFjaXR5CgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuN30KZ2dwbG90KGRfZGV2X2ZhY3Rvcl9yYXRpbmcgJT4lCiAgICAgICAgIG11dGF0ZShkb21haW4gPSByZWNvZGVfZmFjdG9yKAogICAgICAgICAgIGRvbWFpbiwKICAgICAgICAgICAiQk9EIiA9ICJCb2RpbHkgc2Vuc2F0aW9ucyIsCiAgICAgICAgICAgIk5FRyIgPSAiTmVnYXRpdmUgZW1vdGlvbnMiLAogICAgICAgICAgICJQT1MiID0gIlNvY2lhbCBhYmlsaXRpZXMgJiBwb3NpdGl2ZSBlbW90aW9ucyIsCiAgICAgICAgICAgIkNPRyIgPSAiQ29nbml0aW9uICYgY29udHJvbCIsCiAgICAgICAgICAgLmRlZmF1bHQgPSBOQV9jaGFyYWN0ZXJfKSkgJT4lCiAgICAgICAgIG11dGF0ZV9hdCh2YXJzKGNhcGFjaXR5LCBkZXZfZmFjdG9yKSwKICAgICAgICAgICAgICAgICAgIGZ1bnMoZ3N1YigiXyIsICIgIiwgLikpKSAlPiUKICAgICAgICAgbXV0YXRlKGRldl9mYWN0b3IgPSBmYWN0b3IoCiAgICAgICAgICAgZGV2X2ZhY3RvciwKICAgICAgICAgICBsZXZlbHMgPSBnc3ViKCJfIiwgIiAiLCBsZXZlbHMoZF9kZXZfZmFjdG9yX3JhdGluZyRkZXZfZmFjdG9yKSkpKSwKICAgICAgIGFlcyh4ID0gZGV2X2ZhY3RvciwgeSA9IHJlc3BvbnNlLCBjb2xvciA9IGRvbWFpbikpICsKICBmYWNldF93cmFwKH4gZG9tYWluIH4gY2FwYWNpdHksIG5jb2wgPSA0KSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjAyNSwgaGVpZ2h0ID0gMC4yLCB3aWR0aCA9IDAuMikgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gLiAlPiUgZ3JvdXBfYnkoZG9tYWluLCBjYXBhY2l0eSwgZGV2X2ZhY3RvcikgJT4lCiAgICAgICAgICAgICAgICAgICAgbXVsdGlfYm9vdF9zdGFuZGFyZChjb2wgPSAicmVzcG9uc2UiLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBmYXR0ZW4gPSA0KSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiUmF0aW5ncyBvZiBkZXZlbG9wbWVudGFsIGZhY3RvcnMgKFZlcnNpb24gMSkiLAogICAgICAgc3VidGl0bGUgPSAiRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBDSXMiLAogICAgICAgeCA9ICJEZXZlbG9wbWVudGFsIGZhY3RvciIsIAogICAgICAgeSA9ICJSZXNwb25zZSAoMCA9IHBsYXlzIG5vIHJvbGUsIDYgPSBwbGF5cyBhIHZlcnkgaW1wb3J0YW50IHJvbGUpIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuN30KZ2dwbG90KGRfZGV2X2ZhY3Rvcl9yYXRpbmcgJT4lCiAgICAgICAgIG11dGF0ZShkb21haW4gPSByZWNvZGVfZmFjdG9yKAogICAgICAgICAgIGRvbWFpbiwKICAgICAgICAgICAiQk9EIiA9ICJCb2RpbHkgc2Vuc2F0aW9ucyIsCiAgICAgICAgICAgIk5FRyIgPSAiTmVnYXRpdmUgZW1vdGlvbnMiLAogICAgICAgICAgICJQT1MiID0gIlNvY2lhbCBhYmlsaXRpZXMgJiBwb3NpdGl2ZSBlbW90aW9ucyIsCiAgICAgICAgICAgIkNPRyIgPSAiQ29nbml0aW9uICYgY29udHJvbCIsCiAgICAgICAgICAgLmRlZmF1bHQgPSBOQV9jaGFyYWN0ZXJfKSkgJT4lCiAgICAgICAgIG11dGF0ZV9hdCh2YXJzKGNhcGFjaXR5LCBkZXZfZmFjdG9yKSwKICAgICAgICAgICAgICAgICAgIGZ1bnMoZ3N1YigiXyIsICIgIiwgLikpKSAlPiUKICAgICAgICAgbXV0YXRlKGRldl9mYWN0b3IgPSBmYWN0b3IoCiAgICAgICAgICAgZGV2X2ZhY3RvciwKICAgICAgICAgICBsZXZlbHMgPSBnc3ViKCJfIiwgIiAiLCBsZXZlbHMoZF9kZXZfZmFjdG9yX3JhdGluZyRkZXZfZmFjdG9yKSkpKSwKICAgICAgIGFlcyh4ID0gcmVvcmRlcihjYXBhY2l0eSwgYXMubnVtZXJpYyhkb21haW4pKSwgCiAgICAgICAgICAgeSA9IHJlc3BvbnNlLCBjb2xvciA9IGRvbWFpbikpICsKICBmYWNldF93cmFwKH4gZGV2X2ZhY3RvciwgbmNvbCA9IDUpICsKICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuMDI1LCBoZWlnaHQgPSAwLjIsIHdpZHRoID0gMC4yKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSAuICU+JSBncm91cF9ieShkb21haW4sIGNhcGFjaXR5LCBkZXZfZmFjdG9yKSAlPiUKICAgICAgICAgICAgICAgICAgICBtdWx0aV9ib290X3N0YW5kYXJkKGNvbCA9ICJyZXNwb25zZSIsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGZhdHRlbiA9IDQpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEsIHNpemUgPSAzKSkpICsKICBsYWJzKHRpdGxlID0gIlJhdGluZ3Mgb2YgZGV2ZWxvcG1lbnRhbCBmYWN0b3JzIChWZXJzaW9uIDIpIiwKICAgICAgIHN1YnRpdGxlID0gIkVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgQ0lzIiwKICAgICAgIGNvbG9yID0gIkRvbWFpbiIsCiAgICAgICB4ID0gIkNhcGFjaXR5IChieSBkb21haW4pIiwgCiAgICAgICB5ID0gIlJlc3BvbnNlICgwID0gcGxheXMgbm8gcm9sZSwgNiA9IHBsYXlzIGEgdmVyeSBpbXBvcnRhbnQgcm9sZSkiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC44fQpnZ3Bsb3QoZF9kZXZfZmFjdG9yX3JhdGluZyAlPiUKICAgICAgICAgbXV0YXRlKGRldl9mYWN0b3IgPSBmYWN0b3IoCiAgICAgICAgICAgZ3N1YigiXyIsICIgIiwgZGV2X2ZhY3RvciksCiAgICAgICAgICAgbGV2ZWxzID0gZ3N1YigiXyIsICIgIiwgbGV2ZWxzKGRfZGV2X2ZhY3Rvcl9yYXRpbmckZGV2X2ZhY3RvcikpKSksCiAgICAgICBhZXMoeCA9IGRldl9mYWN0b3IsIHkgPSByZXNwb25zZSkpICsKICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuMDEsIGhlaWdodCA9IDAuMywgd2lkdGggPSAwLjMsIGNvbG9yID0gImJsdWUiKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSAuICU+JSBncm91cF9ieShkZXZfZmFjdG9yKSAlPiUKICAgICAgICAgICAgICAgICAgICBtdWx0aV9ib290X3N0YW5kYXJkKGNvbCA9ICJyZXNwb25zZSIsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGZhdHRlbiA9IDIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJSYXRpbmdzIG9mIGRldmVsb3BtZW50YWwgZmFjdG9ycyAoVmVyc2lvbiAzKSIsCiAgICAgICBzdWJ0aXRsZSA9ICJFcnJvciBiYXJzIGFyZSBib290c3RyYXBwZWQgOTUlIENJcyIsCiAgICAgICB4ID0gIkRldmVsb3BtZW50YWwgZmFjdG9yIiwgCiAgICAgICB5ID0gIlJlc3BvbnNlICgwID0gcGxheXMgbm8gcm9sZSwgNiA9IHBsYXlzIGEgdmVyeSBpbXBvcnRhbnQgcm9sZSkiKQpgYGAKCgojIEV4cGxvcmF0aW9uOiBFRkEvY2x1c3RlcmluZyBvZiBkZXZlbG9wbWVudGFsIGZhY3RvcnMKCkl0IGNvdWxkIGJlIG5pY2UgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgImRldmxlb3BtZW50YWwgZmFjdG9ycyIgZnJvbSAxMCBkb3duIHRvIHNvbWV0aGluZyBtb3JlIG1hbmFnZWFibGUgZm9yIGFuYWx5c2lzLiBIZXJlIEkgZXhwbG9yZSBFRkEgYW5kIGhpZXJhcmNoaWNhbCBjbHVzdGVyaW5nIGFzIGRpbWVuc2lvbiByZWR1Y3Rpb24gbWV0aG9kcywgYW5kIHJlLXBsb3Qgd2l0aCB0aGVzZSByZXN1bHRzIGluIG1pbmQuCgpgYGB7cn0KdGVtcCA8LSBkX2Rldl9mYWN0b3JfcmF0aW5nICU+JQogIHVuaXRlKGtleSwgUmVzcG9uc2VJZCwgZG9tYWluLCBjYXBhY2l0eSkgJT4lCiAgc3ByZWFkKGRldl9mYWN0b3IsIHJlc3BvbnNlKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoImtleSIpCmBgYAoKYGBge3J9CnJldGVuX2Z1bih0ZW1wLCAidmFyaW1heCIpCiMgZmEucGFyYWxsZWwodGVtcCkKIyBWU1ModGVtcCkKYGBgCgpgYGB7cn0KdGVtcF9lZmEgPC0gZmEodGVtcCwKICAgICAgICAgICAgICAgbmZhY3RvcnMgPSByZXRlbl9mdW4odGVtcCwgInZhcmltYXgiKSwKICAgICAgICAgICAgICAgcm90YXRlID0gInZhcmltYXgiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAyLCBmaWcuYXNwID0gMC44fQpoZWF0bWFwX2Z1bih0ZW1wX2VmYSkgKyAKICBndWlkZXMoZmlsbCA9IGd1aWRlX2NvbG9yYmFyKGJhcmhlaWdodCA9IDgsIGJhcndpZHRoID0gMC41KSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNn0KbGlicmFyeShnZ2RlbmRybykKbGlicmFyeShkZW5kZXh0ZW5kKQoKdGVtcF9oY2x1c3QgPC0gdGVtcCAlPiUKICB0KCkgJT4lCiAgZGlzdCgpICU+JQogIGhjbHVzdCgpCgp0ZW1wX2hjbHVzdF9vcmRlciA8LSBkYXRhLmZyYW1lKG9yZGVyID0gYXMubnVtZXJpYyh0ZW1wX2hjbHVzdCRvcmRlciksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9mYWN0b3IgPSBhcy5jaGFyYWN0ZXIodGVtcF9oY2x1c3QkbGFiZWxzKSkKCnRlbXBfaGNsdXN0ICU+JQogIGdnZGVuZHJvZ3JhbShyb3RhdGUgPSBGKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgjYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAjIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGxhYnModGl0bGUgPSAiSGllcmFyY2hpY2FsIGFnZ2xvbWVyYXRpdmUgY2x1c3RlcmluZyIsIAogICAgICAgc3VidGl0bGUgPSAiQ29tcGxldGUgbGlua2FnZSAoZGVmYXVsdCBmb3Igc3RhdHM6OmhjbHVzdCgpIGZ1bmN0aW9uKSIsCiAgICAgICB4ID0gIkRldmVsb3BtZW50YWwgZmFjdG9yIiwgeSA9ICJIZWlnaHQiKQogICMgYXMuZGVuZHJvZ3JhbSgpICU+JQogICMgc2V0KCJsYWJlbHNfY29sIiwgayA9IDIpICU+JQogICMgcGxvdChob3JpeiA9IFQsIHhsaW0gPSBjKC0xMDAsIDIwMCkpCmBgYAoKYGBge3J9CnRlbXAyIDwtIGRfZGV2X2ZhY3Rvcl9yYXRpbmcgJT4lCiAgbXV0YXRlKGRldl9mYWN0b3JfY2x1c3RlciA9IGNhc2Vfd2hlbigKICAgIGRldl9mYWN0b3IgJWluJSBjKCJleHBlcmltZW50cyIsICJwZW9wbGVfdGVhY2giLCAiYnJhaW5fY2hhbmdlcyIsIAogICAgICAgICAgICAgICAgICAgICAgIm9ic2VydmVzX29iamVjdHMiLCAib2JzZXJ2ZXNfcGVvcGxlIiwgCiAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJhY3RzX3Blb3BsZSIpIH4gImV4dGVybmFsIiwKICAgIGRldl9mYWN0b3IgJWluJSBjKCJwcmVwcm9ncmFtbWVkIiwgIndvbWJfZXhwZXJpZW5jZXMiLCAiYm9keV9ncm93cyIsIAogICAgICAgICAgICAgICAgICAgICAgInNlbnNlc19pbXByb3ZlIikgfiAiaW50ZXJuYWwiLAogICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pKSAlPiUKICBtdXRhdGUoZGV2X2ZhY3Rvcl9jbHVzdGVyID0gZmFjdG9yKGRldl9mYWN0b3JfY2x1c3RlciksCiAgICAgICAgIHJlc3BvbnNlX2NlbnQgPSByZXNwb25zZSAtIDMpICU+JQogIGxlZnRfam9pbih0ZW1wX2hjbHVzdF9vcmRlcikKCmNvbnRyYXN0c19jbHVzdGVyX2VmZiA8LSBjYmluZChFWFQgPSBjKDEsIC0xKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuN30KZ2dwbG90KHRlbXAyICU+JQogICAgICAgICBtdXRhdGUoZG9tYWluID0gcmVjb2RlX2ZhY3RvcigKICAgICAgICAgICBkb21haW4sCiAgICAgICAgICAgIkJPRCIgPSAiQm9kaWx5IHNlbnNhdGlvbnMiLAogICAgICAgICAgICJORUciID0gIk5lZ2F0aXZlIGVtb3Rpb25zIiwKICAgICAgICAgICAiUE9TIiA9ICJTb2NpYWwgYWJpbGl0aWVzICYgcG9zaXRpdmUgZW1vdGlvbnMiLAogICAgICAgICAgICJDT0ciID0gIkNvZ25pdGlvbiAmIGNvbnRyb2wiLAogICAgICAgICAgIC5kZWZhdWx0ID0gTkFfY2hhcmFjdGVyXykpICU+JQogICAgICAgICBtdXRhdGVfYXQodmFycyhjYXBhY2l0eSwgZGV2X2ZhY3RvciksCiAgICAgICAgICAgICAgICAgICBmdW5zKGdzdWIoIl8iLCAiICIsIC4pKSksCiAgICAgICBhZXMoeCA9IHJlb3JkZXIoZGV2X2ZhY3RvciwgYXMubnVtZXJpYyhkZXZfZmFjdG9yX2NsdXN0ZXIpKSwgCiAgICAgICAgICAgeSA9IHJlc3BvbnNlLCBjb2xvciA9IGRvbWFpbiwgc2hhcGUgPSBkZXZfZmFjdG9yX2NsdXN0ZXIpKSArCiAgZmFjZXRfd3JhcCh+IGRvbWFpbiB+IGNhcGFjaXR5LCBuY29sID0gNCkgKwogIGdlb21faml0dGVyKGFscGhhID0gMC4wMjUsIGhlaWdodCA9IDAuMiwgd2lkdGggPSAwLjIsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gLiAlPiUgZ3JvdXBfYnkoZG9tYWluLCBjYXBhY2l0eSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZmFjdG9yX2NsdXN0ZXIsIGRldl9mYWN0b3IpICU+JQogICAgICAgICAgICAgICAgICAgIG11bHRpX2Jvb3Rfc3RhbmRhcmQoY29sID0gInJlc3BvbnNlIiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgZmF0dGVuID0gNCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiUmF0aW5ncyBvZiBkZXZlbG9wbWVudGFsIGZhY3RvcnMgKFZlcnNpb24gMSkiLAogICAgICAgc3VidGl0bGUgPSAiRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBDSXMiLAogICAgICAgc2hhcGUgPSAiVHlwZSBvZiBkZXZlbG9wbWVudGFsIGZhY3RvciAocGVyIEVGQS9jbHVzdGVyaW5nKSIsCiAgICAgICB4ID0gIkRldmVsb3BtZW50YWwgZmFjdG9yIiwgCiAgICAgICB5ID0gIlJlc3BvbnNlICgwID0gcGxheXMgbm8gcm9sZSwgNiA9IHBsYXlzIGEgdmVyeSBpbXBvcnRhbnQgcm9sZSkiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC43fQpnZ3Bsb3QodGVtcDIgJT4lCiAgICAgICAgIG11dGF0ZShkb21haW4gPSByZWNvZGVfZmFjdG9yKAogICAgICAgICAgIGRvbWFpbiwKICAgICAgICAgICAiQk9EIiA9ICJCb2RpbHkgc2Vuc2F0aW9ucyIsCiAgICAgICAgICAgIk5FRyIgPSAiTmVnYXRpdmUgZW1vdGlvbnMiLAogICAgICAgICAgICJQT1MiID0gIlNvY2lhbCBhYmlsaXRpZXMgJiBwb3NpdGl2ZSBlbW90aW9ucyIsCiAgICAgICAgICAgIkNPRyIgPSAiQ29nbml0aW9uICYgY29udHJvbCIsCiAgICAgICAgICAgLmRlZmF1bHQgPSBOQV9jaGFyYWN0ZXJfKSkgJT4lCiAgICAgICAgIG11dGF0ZV9hdCh2YXJzKGNhcGFjaXR5KSwKICAgICAgICAgICAgICAgICAgIGZ1bnMoZ3N1YigiXyIsICIgIiwgLikpKSwKICAgICAgIGFlcyh4ID0gcmVvcmRlcihjYXBhY2l0eSwgYXMubnVtZXJpYyhkb21haW4pKSwgCiAgICAgICAgICAgeSA9IHJlc3BvbnNlLCBjb2xvciA9IGRvbWFpbikpICsKICBmYWNldF93cmFwKGRldl9mYWN0b3JfY2x1c3RlciB+IGRldl9mYWN0b3IsIG5jb2wgPSA2KSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjAyNSwgaGVpZ2h0ID0gMC4yLCB3aWR0aCA9IDAuMikgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gLiAlPiUgZ3JvdXBfYnkoZG9tYWluLCBjYXBhY2l0eSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZmFjdG9yX2NsdXN0ZXIsIGRldl9mYWN0b3IpICU+JQogICAgICAgICAgICAgICAgICAgIG11bHRpX2Jvb3Rfc3RhbmRhcmQoY29sID0gInJlc3BvbnNlIiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgZmF0dGVuID0gNCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSwgc2l6ZSA9IDMpKSkgKwogIGxhYnModGl0bGUgPSAiUmF0aW5ncyBvZiBkZXZlbG9wbWVudGFsIGZhY3RvcnMgKFZlcnNpb24gMykiLAogICAgICAgc3VidGl0bGUgPSAiRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBDSXMiLAogICAgICAgY29sb3IgPSAiRG9tYWluIiwKICAgICAgIHggPSAiQ2FwYWNpdHkgKGJ5IGRvbWFpbikiLCAKICAgICAgIHkgPSAiUmVzcG9uc2UgKDAgPSBwbGF5cyBubyByb2xlLCA2ID0gcGxheXMgYSB2ZXJ5IGltcG9ydGFudCByb2xlKSIpCmBgYAoKCmBgYHtyfQpyX3RlbXAgPC0gbG1lcihyZXNwb25zZSB+IGRvbWFpbiAqIGRldl9mYWN0b3JfY2x1c3RlciArIAogICAgICAgICAgICAgICAgICMgKGRvbWFpbiArIGRldl9mYWN0b3JfY2x1c3RlciB8IFJlc3BvbnNlSWQpICsKICAgICAgICAgICAgICAgICAjIGluY2x1ZGluZyBib3RoIHJhbmRvbSBpbnRlcmNlcHRzIHlpZWxkcyBjb3JyID4gMC45CiAgICAgICAgICAgICAgICAgKDEgKyBkZXZfZmFjdG9yX2NsdXN0ZXIgfCBSZXNwb25zZUlkKSArCiAgICAgICAgICAgICAgICAgKDEgfCBjYXBhY2l0eSkgKyAoMSB8IGRldl9mYWN0b3IpLAogICAgICAgICAgICAgICB0ZW1wMiwKICAgICAgICAgICAgICAgY29udHJhc3RzID0gbGlzdChkb21haW4gPSBjb250cmFzdHNfZG9tYWluX2VmZl9ub0JPRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZmFjdG9yX2NsdXN0ZXIgPSBjb250cmFzdHNfY2x1c3Rlcl9lZmYpKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KHJfdGVtcCkKYGBgCgooTm90ZSB0aGF0IGRvbWFpbiB3YXMgZWZmZWN0LWNvZGVkIGFuZCBsZWF2ZXMgb3V0IHRoZSBfYm9kaWx5IHNlbnNhdGlvbnNfIGRvbWFpbiBoZXJlLCBidXQgd2UgY291bGQgcmUtY29kZSBpdCBpbiBhbGwgdGhlIGRpZmZlcmVudCB3YXlzIHRvIGdldCB0aGUgY29udHJhc3QgYmV0d2VlbiBfYm9kaWx5IHNlbnNhdGlvbnNfIGFuZCB0aGUgZ3JhbmQgbWVhbiBhcyBkZXNpcmVkLikKCkkgc2VlIHRocmVlIHRha2UtYXdheXMgZnJvbSB0aGVzZSByZWdyZXNzaW9uIHJlc3VsdHMsIGFsbCBvZiB3aGljaCBJIHRoaW5rIEkgY2FuIHNlZSByZWZsZWN0ZWQgaW4gdGhlIHBsb3RzIGFib3ZlOgoKMS4gUGFydGljaXBhbnRzIHBlcmNlaXZlZCB0aGUgZG9tYWluIG9mIF9zb2NpYWwgY29ubmVjdGlvbiBhbmQgcG9zaXRpdmUgZW1vdGlvbnNfIHRvIGJlIHBhcnRpY3VsYXJseSBkcmFtYXRpY2FsbHkgc2hhcGVkIGJ5IHRoZSBzZXQgb2YgZGV2ZWxvcG1lbnRhbCBmYWN0b3JzIHdlIGluY2x1ZGVkIGluIHRoaXMgc3R1ZHkgKHJlbGF0aXZlIHRvIHRoZSBncmFuZCBtZWFuIGNvbGxhcHNpbmcgYWNyb3NzIGRvbWFpbnMpLgoyLiBPbiB0aGUgd2hvbGUsIHBhcnRpY2lwYW50cyBlbmRvcnNlZCAiZXh0ZXJuYWwiIGFuZCAiaW50ZXJuYWwiIGRldmVsb3BtZW50YWwgZmFjdG9ycyBlcXVhbGx5IHN0cm9uZ2x5LiBJZiB3ZSB3ZXJlIG1hcHBpbmcgdGhpcyBvbnRvIHNvbWUgc29ydCBvZiBuYXR1cmUtbnVydXR1cmUgZGlzdGluY3Rpb24gKG5vdCBwZXJmZWN0LCBidXQgdGVtcHRpbmcpLCBJIHRoaW5rIHdlJ2Qgc2F5IHRoYXQgdGhlcmUncyBubyBldmlkZW5jZSBmb3IgcGFydGljaXBhbnRzIGZhdm9yaW5nIGVpdGhlciBuYXR1cmUgb3IgbnVydHVyZSBvdmVyIHRoZSBvdGhlciBhcyBhbiBleHBsYW5hdGlvbiBmb3IgZ3Jvd3RoIGluIHRoZSBjYXBhY2l0aWVzIHdlIGluY2x1ZGVkIGluIHRoaXMgc3R1ZHkuCjMuIEhvd2V2ZXIsIHRoZWlyIGVuZG9yc2VtZW50IG9mICJleHRlcm5hbCIgYW5kICJpbnRlcm5hbCIgZGV2ZWxvcG1lbnRhbCBmYWN0b3JzIHZhcmllZCBieSBkb21haW4uIFRoZXkgcGVyY2VpdmVkICJleHRlcm5hbCIgZmFjdG9ycyB0byBwbGF5IGEgbGFyZ2VyIHJvbGUgaW4gdGhlIGRvbWFpbnMgb2YgX3NvY2lhbCBjb25uZWN0aW9uIGFuZCBwb3NpdGl2ZSBlbW90aW9uc18gYW5kIGVzcGVjaWFsbHkgX2NvZ25pdGlvbiBhbmQgY29udHJvbF8sIGFuZCBhIHJlbGF0aXZlbHkgc21hbGwgcm9sZSBpbiB0aGUgZG9tYWluIG9mIF9uZWdhdGl2ZSBlbW90aW9uc18uIChMb29raW5nIGF0IHRoZSBwbG90cywgaXQgc2VlbXMgbGlrZSBleHRlcm5hbCBmYWN0b3JzIHdlcmUgcGVyY2VpdmVkIGFzIG11Y2ggbW9yZSBpbXBvcnRhbnQgdGhhbiBpbnRlcm5hbCBmYWN0b3JzIGZvciBfY29nbml0aW9uIGFuZCBjb250cm9sXywgYSBiaXQgbW9yZSBpbXBvcnRhbnQgdGhhbiBpbnRlcm5hbCBmYWN0b3JzIGZvciBfc29jaWFsIGNvbm5lY3Rpb24gYW5kIHBvc2l0aXZlIGVtb3Rpb25zXywgcm91Z2hseSBlcXVhbGx5IGltcG9ydGFudCB0byBpbnRlcm5hbCBmYWN0b3JzIGZvciBfbmVnYXRpdmUgZW1vdGlvbnNfLCBhbmQgbGVzcyBpbXBvcnRhbnQgdGhhbiBpbnRlcm5hbCBmYWN0b3JzIGZvciBfYm9kaWx5IHNlbnNhdGlvbnNfLiBUaGVzZSBpbnRlcmFjdGlvbiB0ZXJtcyBqdXN0IGNvbmZpcm0gdGhhdCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuICJleHRlcm5hbCIgYW5kICJpbnRlcm5hbCIgdmFyaWVkIHNpZ25pZmljYW50bHkgYWNyb3NzIGRvbWFpbnMuKSAKCgojIFRhYmxlOiBBbnN3ZXJzIHRvIChvcHRpb25hbCkgZnJlZS1yZXNwb25zZSBxdWVzdGlvbiBhYm91dCBvdGhlciBkZXZlbG9wbWVudGFsIGZhY3RvcnMKCmBgYHtyfQpkX2Rldl9mYWN0b3Jfb3RoZXIgJT4lCiAgbXV0YXRlKGRvbWFpbiA9IHJlY29kZV9mYWN0b3IoCiAgICBkb21haW4sCiAgICAiQk9EIiA9ICJCb2RpbHkgc2Vuc2F0aW9ucyIsCiAgICAiTkVHIiA9ICJOZWdhdGl2ZSBlbW90aW9ucyIsCiAgICAiUE9TIiA9ICJTb2NpYWwgYWJpbGl0aWVzICYgcG9zaXRpdmUgZW1vdGlvbnMiLAogICAgIkNPRyIgPSAiQ29nbml0aW9uICYgY29udHJvbCIsCiAgICAuZGVmYXVsdCA9IE5BX2NoYXJhY3Rlcl8pLAogICAgY2FwYWNpdHkgPSBnc3ViKCJfIiwgIiAiLCBjYXBhY2l0eSkpICU+JQogIGZpbHRlcihyZXNwb25zZSAhPSAiaWRrIikgJT4lCiAgZGlzdGluY3QoZG9tYWluLCBjYXBhY2l0eSwgcmVzcG9uc2UpICU+JQogIGFycmFuZ2UoZG9tYWluLCBjYXBhY2l0eSwgcmVzcG9uc2UpICU+JQogIGthYmxlKGNhcHRpb24gPSAiRnJlZSByZXNwb25zZXMgdG8gb3B0aW9uYWwgcXVlc3Rpb24gYWJvdXQgb3RoZXIgZGV2ZWxvcG1lbnRhbCBmYWN0b3JzIHRoYXQgbWlnaHQgcGxheSBhIHJvbGUgKGV4Y2x1ZGluZyBhbnN3ZXJzIGxpa2UgJ04vQSwnICdubywnICdub3QgdGhhdCBJIGNhbiB0aGluayBvZicsIGV0Yy4pIikgJT4lCiAga2FibGVfc3R5bGluZygpICU+JQogIGNvbGxhcHNlX3Jvd3MoMToyKQpgYGAKCiMgUGxvdHM6IE1vc3QgaW1wb3J0YW50IGRldmVsb3BtZW50YWwgZmFjdG9yLCBieSBkb21haW4gYW5kIGNhcGFjaXR5CgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuN30KZ2dwbG90KGRfZGV2X2ZhY3Rvcl9tb3N0X2ltcG9ydGFudF9jaG9pY2UgJT4lCiAgICAgICAgIG11dGF0ZShkb21haW4gPSByZWNvZGVfZmFjdG9yKAogICAgICAgICAgIGRvbWFpbiwKICAgICAgICAgICAiQk9EIiA9ICJCb2RpbHkgc2Vuc2F0aW9ucyIsCiAgICAgICAgICAgIk5FRyIgPSAiTmVnYXRpdmUgZW1vdGlvbnMiLAogICAgICAgICAgICJQT1MiID0gIlNvY2lhbCBhYmlsaXRpZXMgJiBwb3NpdGl2ZSBlbW90aW9ucyIsCiAgICAgICAgICAgIkNPRyIgPSAiQ29nbml0aW9uICYgY29udHJvbCIsCiAgICAgICAgICAgLmRlZmF1bHQgPSBOQV9jaGFyYWN0ZXJfKSkgJT4lCiAgICAgICAgIG11dGF0ZShkZXZfZmFjdG9yID0gY2FzZV93aGVuKAogICAgICAgICAgIGdyZXBsKCJPdGhlciIsIHJlc3BvbnNlKSB+ICJvdGhlciIsCiAgICAgICAgICAgZ3JlcGwoInRlYWNoIiwgcmVzcG9uc2UpIH4gInBlb3BsZSB0ZWFjaCIsCiAgICAgICAgICAgZ3JlcGwoImV4cGVyaW1lbnRzIiwgcmVzcG9uc2UpIH4gImV4cGVyaW1lbnRzIiwKICAgICAgICAgICBncmVwbCgid29tYiIsIHJlc3BvbnNlKSB+ICJ3b21iIGV4cGVyaWVuY2VzIiwKICAgICAgICAgICBncmVwbCgiaW50ZXJhY3RzIiwgcmVzcG9uc2UpIH4gImludGVyYWN0cyBwZW9wbGUiLAogICAgICAgICAgIGdyZXBsKCJwcmVwcm9ncmFtbWVkIiwgcmVzcG9uc2UpIH4gInByZXByb2dyYW1tZWQiLAogICAgICAgICAgIGdyZXBsKCJvYmplY3RzIiwgcmVzcG9uc2UpIH4gIm9ic2VydmVzIG9iamVjdHMiLAogICAgICAgICAgIGdyZXBsKCJvYnNlcnZlcyB0aGUgcGVvcGxlIiwgcmVzcG9uc2UpIH4gIm9ic2VydmVzIHBlb3BsZSIsCiAgICAgICAgICAgZ3JlcGwoImJvZHkgZ3Jvd3MiLCByZXNwb25zZSkgfiAiYm9keSBncm93cyIsCiAgICAgICAgICAgZ3JlcGwoImJyYWluIGNoYW5nZXMiLCByZXNwb25zZSkgfiAiYnJhaW4gY2hhbmdlcyIsCiAgICAgICAgICAgZ3JlcGwoInNlbnNlcyBpbXByb3ZlIiwgcmVzcG9uc2UpIH4gInNlbnNlcyBpbXByb3ZlIiksCiAgICAgICAgICAgZGV2X2ZhY3RvciA9IGZhY3RvcigKICAgICAgICAgICAgIGRldl9mYWN0b3IsCiAgICAgICAgICAgICBsZXZlbHMgPSBjKGdzdWIoIl8iLCAiICIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyhkX2Rldl9mYWN0b3JfcmF0aW5nJGRldl9mYWN0b3IpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIm90aGVyIikpKSAlPiUKICAgICAgICAgbXV0YXRlX2F0KHZhcnMoY2FwYWNpdHksIHJlc3BvbnNlKSwKICAgICAgICAgICAgICAgICAgIGZ1bnMoZ3N1YigiXyIsICIgIiwgLikpKSwKICAgICAgIGFlcyh4ID0gZGV2X2ZhY3RvciwgZmlsbCA9IGRvbWFpbikpICsKICBmYWNldF93cmFwKH4gZG9tYWluIH4gY2FwYWNpdHksIG5jb2wgPSA0KSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGdlb21fYmFyKCkgKwogIGxhYnModGl0bGUgPSAiQ2hvaWNlIG9mIG1vc3QgaW1wb3J0YW50IGRldmVsb3BtZW50YWwgZmFjdG9yIChWZXJzaW9uIDEpIiwKICAgICAgIHggPSAiRGV2ZWxvcG1lbnRhbCBmYWN0b3IiLCAKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjd9CnRlbXBfb3RoZXIgPC0gZF9kZXZfZmFjdG9yX21vc3RfaW1wb3J0YW50X2Nob2ljZSAlPiUgCiAgZmlsdGVyKGdyZXBsKCJPdGhlciIsIHJlc3BvbnNlKSkgJT4lIAogIGNvdW50KGRvbWFpbiwgY2FwYWNpdHkpCgpnZ3Bsb3QoZF9kZXZfZmFjdG9yX21vc3RfaW1wb3J0YW50X2Nob2ljZSAlPiUKICAgICAgICAgbXV0YXRlKGRvbWFpbiA9IHJlY29kZV9mYWN0b3IoCiAgICAgICAgICAgZG9tYWluLAogICAgICAgICAgICJCT0QiID0gIkJvZGlseSBzZW5zYXRpb25zIiwKICAgICAgICAgICAiTkVHIiA9ICJOZWdhdGl2ZSBlbW90aW9ucyIsCiAgICAgICAgICAgIlBPUyIgPSAiU29jaWFsIGFiaWxpdGllcyAmIHBvc2l0aXZlIGVtb3Rpb25zIiwKICAgICAgICAgICAiQ09HIiA9ICJDb2duaXRpb24gJiBjb250cm9sIiwKICAgICAgICAgICAuZGVmYXVsdCA9IE5BX2NoYXJhY3Rlcl8pKSAlPiUKICAgICAgICAgbXV0YXRlKGRldl9mYWN0b3IgPSBjYXNlX3doZW4oCiAgICAgICAgICAgZ3JlcGwoIk90aGVyIiwgcmVzcG9uc2UpIH4gIm90aGVyIiwKICAgICAgICAgICBncmVwbCgidGVhY2giLCByZXNwb25zZSkgfiAicGVvcGxlIHRlYWNoIiwKICAgICAgICAgICBncmVwbCgiZXhwZXJpbWVudHMiLCByZXNwb25zZSkgfiAiZXhwZXJpbWVudHMiLAogICAgICAgICAgIGdyZXBsKCJ3b21iIiwgcmVzcG9uc2UpIH4gIndvbWIgZXhwZXJpZW5jZXMiLAogICAgICAgICAgIGdyZXBsKCJpbnRlcmFjdHMiLCByZXNwb25zZSkgfiAiaW50ZXJhY3RzIHBlb3BsZSIsCiAgICAgICAgICAgZ3JlcGwoInByZXByb2dyYW1tZWQiLCByZXNwb25zZSkgfiAicHJlcHJvZ3JhbW1lZCIsCiAgICAgICAgICAgZ3JlcGwoIm9iamVjdHMiLCByZXNwb25zZSkgfiAib2JzZXJ2ZXMgb2JqZWN0cyIsCiAgICAgICAgICAgZ3JlcGwoIm9ic2VydmVzIHRoZSBwZW9wbGUiLCByZXNwb25zZSkgfiAib2JzZXJ2ZXMgcGVvcGxlIiwKICAgICAgICAgICBncmVwbCgiYm9keSBncm93cyIsIHJlc3BvbnNlKSB+ICJib2R5IGdyb3dzIiwKICAgICAgICAgICBncmVwbCgiYnJhaW4gY2hhbmdlcyIsIHJlc3BvbnNlKSB+ICJicmFpbiBjaGFuZ2VzIiwKICAgICAgICAgICBncmVwbCgic2Vuc2VzIGltcHJvdmUiLCByZXNwb25zZSkgfiAic2Vuc2VzIGltcHJvdmUiKSwKICAgICAgICAgICBkZXZfZmFjdG9yID0gZmFjdG9yKAogICAgICAgICAgICAgZGV2X2ZhY3RvciwKICAgICAgICAgICAgIGxldmVscyA9IGMoZ3N1YigiXyIsICIgIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzKGRfZGV2X2ZhY3Rvcl9yYXRpbmckZGV2X2ZhY3RvcikpLAogICAgICAgICAgICAgICAgICAgICAgICAib3RoZXIiKSkpICU+JQogICAgICAgICBtdXRhdGVfYXQodmFycyhjYXBhY2l0eSwgcmVzcG9uc2UpLAogICAgICAgICAgICAgICAgICAgZnVucyhnc3ViKCJfIiwgIiAiLCAuKSkpICU+JQogICAgICAgICBmaWx0ZXIoZGV2X2ZhY3RvciAhPSAib3RoZXIiKSwKICAgICAgIGFlcyh4ID0gcmVvcmRlcihjYXBhY2l0eSwgYXMubnVtZXJpYyhkb21haW4pKSwgZmlsbCA9IGRvbWFpbikpICsKICBmYWNldF93cmFwKH4gZGV2X2ZhY3RvciwgbmNvbCA9IDUpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBnZW9tX2JhcigpICsKICBsYWJzKHRpdGxlID0gIkNob2ljZSBvZiBtb3N0IGltcG9ydGFudCBkZXZlbG9wbWVudGFsIGZhY3RvciAoVmVyc2lvbiAyKSIsCiAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiRXhjbHVkaW5nIGFuc3dlcnMgb2YgJ290aGVyJyAobiA8ICIsIAogICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHRlbXBfb3RoZXIkbikgKyAxLCAiKSBmb3IgYW55IGNhcGFjaXR5IiksCiAgICAgICBjb2xvciA9ICJEb21haW4iLAogICAgICAgeCA9ICJDYXBhY2l0eSAoYnkgZG9tYWluKSIsIAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7cn0KZF9kZXZfZmFjdG9yX21vc3RfaW1wb3J0YW50X2ZyZWUgJT4lCiAgbXV0YXRlKGRvbWFpbiA9IHJlY29kZV9mYWN0b3IoCiAgICBkb21haW4sCiAgICAiQk9EIiA9ICJCb2RpbHkgc2Vuc2F0aW9ucyIsCiAgICAiTkVHIiA9ICJOZWdhdGl2ZSBlbW90aW9ucyIsCiAgICAiUE9TIiA9ICJTb2NpYWwgYWJpbGl0aWVzICYgcG9zaXRpdmUgZW1vdGlvbnMiLAogICAgIkNPRyIgPSAiQ29nbml0aW9uICYgY29udHJvbCIsCiAgICAuZGVmYXVsdCA9IE5BX2NoYXJhY3Rlcl8pLAogICAgY2FwYWNpdHkgPSBnc3ViKCJfIiwgIiAiLCBjYXBhY2l0eSkpICU+JQogIGRpc3RpbmN0KGRvbWFpbiwgY2FwYWNpdHksIHJlc3BvbnNlKSAlPiUKICBhcnJhbmdlKGRvbWFpbiwgY2FwYWNpdHksIHJlc3BvbnNlKSAlPiUKICBrYWJsZShjYXB0aW9uID0gIkZyZWUgcmVzcG9uc2VzIHdoZW4gJ290aGVyJyB3YXMgc2VsZWN0ZWQgYXMgbW9zdCBpbXBvcnRhbnQgZGV2ZWxvcG1lbnRhbCBmYWN0b3IiKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkgJT4lCiAgY29sbGFwc2Vfcm93cygxOjIpCmBgYAoKCiMgRGVtb2dyYXBoaWNzCgpgYGB7cn0KZ2dwbG90KGRfZGVtbywgYWVzKHggPSBEdXJhdGlvbi82MCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAyKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbWVkaWFuKGRfZGVtbyREdXJhdGlvbi82MCksIGNvbG9yID0gImJsdWUiLCBsdHkgPSAyKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMCwgNCkpICsKICBsYWJzKHRpdGxlID0gIkR1cmF0aW9uIG9mIHN0dWR5IChhY2NvcmRpbmcgdG8gUXVhbHRyaWNzKSIsCiAgICAgICBzdWJ0aXRsZSA9ICJCbHVlIGRvdHRlZCBsaW5lIG1hcmtzIG1lZGlhbiIsCiAgICAgICB4ID0gIkR1cmF0aW9uIChpbiBtaW51dGVzKSIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IEFnZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAyKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbWVkaWFuKGRfZGVtbyRBZ2UpLCBjb2xvciA9ICJibHVlIiwgbHR5ID0gMikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAsIDQpKSArCiAgbGFicyh0aXRsZSA9ICJQYXJ0aWNwaWFudCBhZ2UgKHNlbGYtcmVwb3J0ZWQpIiwKICAgICAgIHN1YnRpdGxlID0gIkJsdWUgZG90dGVkIGxpbmUgbWFya3MgbWVkaWFuIiwKICAgICAgIHggPSAiQWdlIChpbiB5ZWFycykiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7cn0KZ2dwbG90KGRfZGVtbywgYWVzKHggPSBHZW5kZXJTZXgpKSArIAogIGdlb21fYmFyKCkgKwogIGxhYnModGl0bGUgPSAiUGFydGljcGlhbnQgZ2VuZGVyL3NleCAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgeCA9ICJHZW5kZXIvc2V4IiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3J9CmdncGxvdChkX2RlbW8sIGFlcyh4ID0gZ3N1YignKC57MSwzMH0pKFxcc3wkKScsICdcXDFcbicsIFJhY2VFdGhuaWNpdHlfY29sbGFwc2UpKSkgKyAKICBnZW9tX2JhcigpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIlBhcnRpY3BpYW50IHJhY2UvZXRobmljaXR5IChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICB4ID0gIlJhY2UvZXRobmljaXR5IiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3J9CmdncGxvdChkX2RlbW8sIGFlcyh4ID0gRmlyc3RMYW5nKSkgKyAKICBnZW9tX2JhcigpICsKICBsYWJzKHRpdGxlID0gIlBhcnRpY3BpYW50IGZpcnN0IGxhbmd1YWdlIChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICB4ID0gIkxhbmd1YWdlIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3J9CmdncGxvdChkX2RlbW8sIGFlcyh4ID0gZmFjdG9yKEVkdWNhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gbGV2ZWxzKGQkRWR1Y2F0aW9uKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gZ3N1YignKC57MSwzMH0pKFxcc3wkKScsICdcXDFcbicsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyhkJEVkdWNhdGlvbikpKSkpICsgCiAgZ2VvbV9iYXIoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJQYXJ0aWNwaWFudCBlZHVjYXRpb25hbCBhdHRhaW5tZW50IChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICB4ID0gIkhpZ2hlc3QgbGV2ZWwgb2YgZWR1Y2F0aW9uIGNvbXBsZXRlZCIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IEluY29tZSkpICsgCiAgZ2VvbV9iYXIoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJQYXJ0aWNwaWFudCBob3VzZWhvbGQgaW5jb21lIChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICB4ID0gIkFubnVhbCBob3VzZWhvbGQgaW5jb21lIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3J9CmdncGxvdChkX2RlbW8sIGFlcyh4ID0gSG91c2Vob2xkU2l6ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbWVkaWFuKGRfZGVtbyRIb3VzZWhvbGRTaXplKSwgY29sb3IgPSAiYmx1ZSIsIGx0eSA9IDIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwLCAxKSkgKwogIGxhYnModGl0bGUgPSAiUGFydGljcGlhbnQgaG91c2Vob2xkIHNpemUgKHNlbGYtcmVwb3J0ZWQpIiwKICAgICAgIHN1YnRpdGxlID0gIkJsdWUgZG90dGVkIGxpbmUgbWFya3MgbWVkaWFuIiwKICAgICAgIHggPSAiTnVtYmVyIG9mIHBlb3BsZSBpbiBob3VzZWhvbGQgKGFkdWx0cyBhbmQgY2hpbGRyZW4pIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3J9CmdncGxvdChkX2RlbW8sIGFlcyh4ID0gTWFyaXRhbFN0YXR1cykpICsgCiAgZ2VvbV9iYXIoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJQYXJ0aWNwaWFudCBtYXJpdGFsIHN0YXR1cyAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgeCA9ICJNYXJpdGFsIHN0YXR1cyIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IFBhcmVudCkpICsgCiAgZ2VvbV9iYXIoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJQYXJ0aWNwaWFudCBwYXJlbnQgc3RhdHVzIChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICBzdWJ0aXRsZSA9ICInTkEnIGluZGljYXRlcyByZXNwb25zZSBvZiAnUHJlZmVyIG5vdCB0byBzYXknIiwKICAgICAgIHggPSAiUGFyZW50IHN0YXR1cyIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vICU+JSBmaWx0ZXIoUGFyZW50ID09ICJZZXMiKSwgYWVzKHggPSBDaGlsZHJlbk51bWJlcikpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbWVkaWFuKGRfZGVtb1tkX2RlbW8kUGFyZW50ID09ICJZZXMiLF0kQ2hpbGRyZW5OdW1iZXIsIG5hLnJtID0gVCksIAogICAgICAgICAgICAgY29sb3IgPSAiYmx1ZSIsIGx0eSA9IDIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwLCAxKSkgKwogIGxhYnModGl0bGUgPSAiTnVtYmVyIG9mIGNoaWxkcmVuIGFtb25nIHBhcmVudHMgKHNlbGYtcmVwb3J0ZWQpIiwKICAgICAgIHN1YnRpdGxlID0gIkJsdWUgZG90dGVkIGxpbmUgbWFya3MgbWVkaWFuIiwKICAgICAgIHggPSAiTnVtYmVyIG9mIGNoaWxkcmVuIChhbW9uZyBwYXJlbnRzKSIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vICU+JSBmaWx0ZXIoUGFyZW50ID09ICJZZXMiKSwgCiAgICAgICBhZXMoeCA9IGZhY3RvcihDaGlsZHJlbllvdW5nZXN0QWdlX2NvbGxhcHNlLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gbGV2ZWxzKGRfZGVtbyRDaGlsZHJlbllvdW5nZXN0QWdlX2NvbGxhcHNlKSwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGdzdWIoJyguezEsMzB9KShcXHN8JCknLCAnXFwxXG4nLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzKGRfZGVtbyRDaGlsZHJlbllvdW5nZXN0QWdlX2NvbGxhcHNlKSkpKSkgKyAKICBnZW9tX2JhcigpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIkFnZSBvZiB5b3VuZ2VzdCBjaGlsZCBhbW9uZyBwYXJlbnRzIChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICB4ID0gIkFnZSBvZiBjaGlsZCIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vICU+JSBmaWx0ZXIoUGFyZW50ID09ICJZZXMiKSwgCiAgICAgICBhZXMoeCA9IGZhY3RvcihDaGlsZHJlbk9sZGVzdEFnZV9jb2xsYXBzZSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGxldmVscyhkX2RlbW8kQ2hpbGRyZW5PbGRlc3RBZ2VfY29sbGFwc2UpLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gZ3N1YignKC57MSwzMH0pKFxcc3wkKScsICdcXDFcbicsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMoZF9kZW1vJENoaWxkcmVuT2xkZXN0QWdlX2NvbGxhcHNlKSkpKSkgKyAKICBnZW9tX2JhcigpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIkFnZSBvZiBvbGRlc3QgY2hpbGQgYW1vbmcgcGFyZW50cyAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgeCA9ICJBZ2Ugb2YgY2hpbGQiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CmRfZGVtbyAlPiUKICBkaXN0aW5jdChDb21tZW50cykgJT4lCiAgbXV0YXRlKENvbW1lbnRzID0gZ3N1YigiICQiLCAiIiwgQ29tbWVudHMpLAogICAgICAgICBDb21tZW50cyA9IGdzdWIoIlxcISQiLCAiIiwgQ29tbWVudHMpLAogICAgICAgICBDb21tZW50cyA9IGdzdWIoIlxcLiQiLCAiIiwgQ29tbWVudHMpKSAlPiUKICBmaWx0ZXIodG9sb3dlcihDb21tZW50cykgIT0gIm4vYSIsIAogICAgICAgICB0b2xvd2VyKENvbW1lbnRzKSAhPSAibmEiLAogICAgICAgICB0b2xvd2VyKENvbW1lbnRzKSAhPSAibm8iLCAKICAgICAgICAgdG9sb3dlcihDb21tZW50cykgIT0gIm5vIGNvbW1lbnQiLAogICAgICAgICB0b2xvd2VyKENvbW1lbnRzKSAhPSAibm8gY29tbWVudHMiLCAKICAgICAgICAgdG9sb3dlcihDb21tZW50cykgIT0gIm5vIGFkZGl0aW9uYWwgY29tbWVudHMiLCAKICAgICAgICAgdG9sb3dlcihDb21tZW50cykgIT0gIm5pbCIsIAogICAgICAgICB0b2xvd2VyKENvbW1lbnRzKSAhPSAibm8gb3RoZXIgY29tbWVudHMiLAogICAgICAgICB0b2xvd2VyKENvbW1lbnRzKSAhPSAibm8gZnVydGhlciByZW1hcmtzIiwgCiAgICAgICAgIHRvbG93ZXIoQ29tbWVudHMpICE9ICJubyB0aGFuayB5b3UiLCAKICAgICAgICAgdG9sb3dlcihDb21tZW50cykgIT0gIm5vIHRoZXJlIGlzIG5vdC4gdGhhbmtzIiwgCiAgICAgICAgIHRvbG93ZXIoQ29tbWVudHMpICE9ICJub25lIiwKICAgICAgICAgdG9sb3dlcihDb21tZW50cykgIT0gIm5vbmUuIHRoYW5rIHlvdSIsIAogICAgICAgICB0b2xvd2VyKENvbW1lbnRzKSAhPSAibm9uZSwgdGhhbmsgeW91IiwgCiAgICAgICAgIHRvbG93ZXIoQ29tbWVudHMpICE9ICJub3BlLCB0aGFuayB5b3UgZm9yIGxldHRpbmcgbWUgdGFrZSB0aGlzIiwKICAgICAgICAgdG9sb3dlcihDb21tZW50cykgIT0gIm5vdGhpbmcgYXQgdGhlIG1vbWVudCIsCiAgICAgICAgIHRvbG93ZXIoQ29tbWVudHMpICE9ICJ0aGFuayB5b3UiLAogICAgICAgICB0b2xvd2VyKENvbW1lbnRzKSAhPSAidGhhbmsgeW91IGZvciB0aGUgb3Bwb3J0dW5pdHkgdG8gdGFrZSBwYXJ0IGluIHRoaXMgc3R1ZHkiLAogICAgICAgICB0b2xvd2VyKENvbW1lbnRzKSAhPSAidGhhbmsgeW91IGZvciB0aGlzIG9wcG9ydHVuaXR5IiwKICAgICAgICAgdG9sb3dlcihDb21tZW50cykgIT0gInRoYW5rcyIsCiAgICAgICAgIHRvbG93ZXIoQ29tbWVudHMpICE9ICJ0aGFua3MgZm9yIHRoZSBvcHBvcnR1bml0eSBhbmQgZ29vZCBsdWNrIHdpdGggeW91ciByZXNlYXJjaCIsCiAgICAgICAgIHRvbG93ZXIoQ29tbWVudHMpICE9ICJ0aGFua3MgZm9yIHRoZSBvcHBvcnR1bml0eSIpICU+JQogIGFycmFuZ2UoQ29tbWVudHMpICU+JQogIGthYmxlKGNhcHRpb24gPSAiRnJlZSByZXNwb25zZXMgdG8gb3B0aW9uYWwgJ2NvbW1lbnRzJyBmaWVsZCAoZXhjbHVkaW5nIGFuc3dlcnMgbGlrZSAnTi9BLCcgJ25vLCcgJ25vdCB0aGF0IEkgY2FuIHRoaW5rIG9mJywgJ3RoYW5rIHlvdScsIGV0Yy4sIHdoZW4gdGhleSB3ZXJlIGVhc3kgdG8gZXhjbHVkZSkiKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCg==